在管理外键中指定Django代理模型

2024-10-04 01:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在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中的外键使用代理模型?你知道吗


Tags: 模型selffriendtruegetreturnmodelsdef
1条回答
网友
1楼 · 发布于 2024-10-04 01:23:38

这里的问题是您的ForeignKey指向Friend模型。模型的默认管理器会过滤掉所有的亲戚,因此这将不起作用。你知道吗

解决这个问题的一个简单方法是重新构造模型。引入类似于泛型Person模型的东西,并使用proxy=True从中继承FriendRelativePerson模型不应该有一个预过滤实例的管理器;然后您可以让您的ForeignKey指向person。你知道吗

相关问题 更多 >