在Django 1.11中,我有一个模型Friend
,和一个代理模型Relative
:
class FriendManager(models.Manager):
def get_queryset(self):
return super(RelativeManager, self).get_queryset().filter(is_relative=False)
class Friend(models.Model):
# Model fields defined here
objects = FriendManager()
class RelativeManager(models.Manager):
def get_queryset(self):
return super(RelativeManager, self).get_queryset().filter(is_relative=True)
class Relative(Friend):
class Meta:
proxy = True
objects = RelativeManager()
def save(self, *args, **kwargs):
self.is_relative = True
super(Relative, self).save(*args, **kwargs)
我还有一个模型FriendPortrait
,它有一个外键字段friend
:
class FriendPortrait(models.Model):
friend = models.ForeignKey(Friend)
委托书:
class RelativePortrait(FriendPortrait):
class Meta:
proxy = True
现在,我希望RelativePortraits的详细视图只在friend
的下拉列表中显示亲属。你知道吗
管理员.py:
@admin.register(RelativePortrait)
class RelativePortraitAdmin(admin.ModelAdmin):
fields = ('friend')
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'friend':
kwargs['queryset'] = Relative.objects.all()
return super(RelativePortraitAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
这是有效的,因为只有亲属显示在friend
下拉列表中。但是,当我尝试保存肖像时,Django admin会给我一个验证错误:
friend instance with id 14 does not exist.
如何指定要对RelativePortraitAdmin
中的外键使用代理模型?你知道吗
这里的问题是您的
ForeignKey
指向Friend
模型。模型的默认管理器会过滤掉所有的亲戚,因此这将不起作用。你知道吗解决这个问题的一个简单方法是重新构造模型。引入类似于泛型
Person
模型的东西,并使用proxy=True
从中继承Friend
和Relative
。Person
模型不应该有一个预过滤实例的管理器;然后您可以让您的ForeignKey
指向person。你知道吗相关问题 更多 >
编程相关推荐