简体   繁体   English

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

[英]Specify Django proxy model in admin foreign key

In Django 1.11, I have a model Friend , and a proxy model Relative : 在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)

I also have a model FriendPortrait , which has a foreign key field friend : 我也有一个模型FriendPortrait ,它有一个外键字段friend

class FriendPortrait(models.Model):
  friend = models.ForeignKey(Friend)

And a proxy on that: 还有一个代理:

class RelativePortrait(FriendPortrait):
  class Meta:
    proxy = True

Now, I want the detail view for RelativePortraits to only show relatives in the drop-down for friend . 现在,我希望RelativePortraits的详细视图仅在friend的下拉列表中显示亲戚。

admin.py: admin.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)

This works, in that only relatives are displayed in the friend drop-down. 之所以有效,是因为在friend下拉列表中仅显示亲戚。 However, when I try to save a portrait, Django admin gives me a validation error: 但是,当我尝试保存肖像时,Django管理员给了我一个验证错误:

friend instance with id 14 does not exist. ID为14的好友实例不存在。

How can I specify that I want to use a proxy model for my foreign key in the RelativePortraitAdmin ? 如何在RelativePortraitAdmin指定要对我的外键使用代理模型?

The problem here is that your ForeignKey points to the Friend model. 这里的问题是您的ForeignKey指向Friend模型。 The model's default manager filters out all relatives, so this will not work. 模型的默认管理员会过滤掉所有亲戚,因此这将不起作用。

A simple way to solve this would be to restructure your models a bit. 解决此问题的简单方法是稍微重构模型。 Introducing something like a generic Person model and having Friend and Relative inherit from it with proxy=True . 引入诸如通用Person模型之类的内容,并使用proxy=True从其继承FriendRelative The Person model shouldn't have a manager that pre-filters the instances; Person模型不应该具有预先过滤实例的管理器; then you could have your ForeignKey point to person. 那么您可以将ForeignKey指向某人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM