Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在管理外键中指定Django代理模型_Python_Django - Fatal编程技术网

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

Python 在管理外键中指定Django代理模型,python,django,Python,Django,在Django 1.11中,我有一个模型朋友和一个代理模型亲戚: 我还有一个模型FriendGrait,它有一个外键字段friend: 和一份委托书: class RelativePortrait(FriendPortrait): class Meta: proxy = True 现在,我希望RelativePortraits的详细视图在friend下拉列表中仅显示亲戚 admin.py: 这是有效的,因为只有亲属显示在“朋友”下拉列表中。但是,当我尝试保存肖像时,Django a

在Django 1.11中,我有一个模型朋友和一个代理模型亲戚:

我还有一个模型FriendGrait,它有一个外键字段friend:

和一份委托书:

class RelativePortrait(FriendPortrait):
  class Meta:
    proxy = True
现在,我希望RelativePortraits的详细视图在friend下拉列表中仅显示亲戚

admin.py:

这是有效的,因为只有亲属显示在“朋友”下拉列表中。但是,当我尝试保存肖像时,Django admin会给我一个验证错误:

id为14的朋友实例不存在


如何指定要在RelativePortraitAdmin中为外键使用代理模型?

这里的问题是您的外键指向朋友模型。模型的默认管理器会过滤掉所有的亲属,因此这将不起作用

解决这个问题的一个简单方法是稍微重新构造模型。引入类似于泛型人物模型的东西,并使用proxy=True从中继承朋友和亲戚。Person模型不应该有一个预筛选实例的经理;然后你就可以把你的外国钥匙交给别人了

class FriendPortrait(models.Model):
  friend = models.ForeignKey(Friend)
class RelativePortrait(FriendPortrait):
  class Meta:
    proxy = True
@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)