我需要在Django中表达多个一对多关系。也就是说,给定几个不同的模型,我需要这些中的每个与单个表具有一对多的关系。从逻辑上讲,这种关系属于模型"拥有"一对多关系,但Django强迫我在目标表上使用多对一关系,而不是源上的一对多关系表。这就是我希望我能做到的事情:
class Sink(models.Model):
name = models.CharField('name', max_length=24)
class A(models.Model):
name = models.CharField('name', max_length=24)
sink = models.ManyToOneField(Sink)
class B(models.Model):
name = models.CharField('name', max_length=24)
sink = models.ManyToOneField(Sink)
但ManyToOneField
并不存在。相反,我应该将ForeignKey
用于每个一对多字段,例如:
class Sink(models.Model):
name = models.CharField('name', max_length=24)
a = models.ForeignKey(A)
b = models.ForeignKey(B)
class A(models.Model):
name = models.CharField('name', max_length=24)
class B(models.Model):
name = models.CharField('name', max_length=24)
逻辑上只是错误,因为从来没有我希望Sink.a和Sink.b都是非null的情况。如果ManyToManyField
允许我指定它不是真的多对多,我可以这样做,但它似乎不允许这样做。做这样的事情的正确方法是什么?
答案 0 :(得分:1)
您可以使用generic relations将您的Sink模型链接到带有GenericForeignKey
的单个A或B模型:
class Sink(models.Model):
name = models.CharField('name', max_length=24)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class A(models.Model):
name = models.CharField('name', max_length=24)
class B(models.Model):
name = models.CharField('name', max_length=24)