我想知道如何实现这种行为,任何帮助都会受到赞赏
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)
答案 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