Django中多个模型的代理模型

时间:2019-02-07 02:34:53

标签: django django-models

我想在django管理员中显示一个模型,但具有在两个要显示的模型之间进行选择的逻辑。

当前实施:

模型

class User(models.Model):
   created = models.DateTimeField(auto_now_add=True, null=True)
   last_updated = models.DateTimeField(auto_now=True)
   name = models.CharField(max_length=30, blank=True)

class ExpectedNames(User):
   class Meta:
      proxy=True`

管理员

@admin.register(ExpectedNames) class ExpectedNamesAdmin(admin.ModelAdmin): date_hierarchy = 'created'

我想做什么:#这样的事情

模型

class User(models.Model):
    created = models.DateTimeField(auto_now_add=True, null=True)
    last_updated = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=30, blank=True)

class User2(models.Model):
    created = models.DateTimeField(auto_now_add=True, null=True)
    last_updated = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=30, blank=True)

class ExpectedNames(User):
    class Meta:
        proxy=True

    if name == "Rick":
    return User
    else:
    return User2

管理员

@admin.register(ExpectedNames) class ExpectedNamesAdmin(admin.ModelAdmin): date_hierarchy = 'created'

任何建议都不确定这是否是正确的方法。

2 个答案:

答案 0 :(得分:0)

我认为这是不可能的,因为它在Django文档中指出:

  

基类限制:   代理模型必须完全继承一个非抽象模型类。您不能从多个非抽象模型继承,因为代理模型无法在不同数据库表中的行之间提供任何连接。代理模型可以从任意数量的抽象模型类继承,只要它们没有定义任何模型字段即可。代理模型也可以从共享公共非抽象父类的任何数量的代理模型中继承。

https://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

答案 1 :(得分:0)

我在相同情况下使用新的魔术方法。

我有模型Documen和字段document_type。如果document_type是'contract',则我希望使用ContractProxy,如果'offer'-OfferProxy,则需要。 为此,我创建了新代理:

class RelatedDocumentProxy(Document):

    class Meta:
        proxy = True

    def __new__(cls, *args, **kwargs):
        doc_type = args[1]
        if doc_type == 'contract':
            return ContractProxy(*args, **kwargs)
        return OfferProxy(*args, **kwargs)

document_type 是第一个字段,并且将第一个传递给方法的参数