关于Django多对多领域的条件相关模型

时间:2018-05-10 07:09:41

标签: django models manytomanyfield

我想知道如何实现这种行为,任何帮助都会受到赞赏

class ModelA(models.Model):
    pass

class ModelB(models.Model):
    pass

class ModelC(models.Model):
    TYPE = (('A', 'ModelA'), ('B', 'ModelB'))
    type = models.CharField("model type", choices=TYPE, max_length=2, unique=True)
    field = models.ManyToManyField(ConditionalModel)

我想在ModelC定义中执行类似的操作 - >

if type="A":
    field = models.ManyToManyField(ModelA)
if type="B":
    field = models.ManyToManyField(ModelB)

2 个答案:

答案 0 :(得分:2)

您不能有条件ManyToManyField到2个不同的Models 最好的方法是使用可以接收任何模型的GenericRelation

将您自己的模型中的外键添加到ContentType允许您的模型有效地将自己绑定到另一个模型类

class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

content_object可以接收任何模型实例。

答案 1 :(得分:1)

创建2 m2m的重新编写,如下所示

class ModelA(models.Model):
    pass

class ModelB(models.Model):
    pass

class ModelC(models.Model):    
    TYPE = (('A', 'ModelA'), ('B', 'ModelB'))
    type = models.CharField("model type", choices=TYPE, max_length=2, unique=True)
    _m2m_A = models.ManyToManyField(ModelA)
    _m2m_B = models.ManyToManyField(ModelB)

    @property
    def field(self):
        if self.type == "A":
           return self._m2m_A
        elif self.type == "B":
           return self._m2m_B