Django中的多个一对多关系

时间:2017-03-08 21:56:39

标签: django django-models

我需要在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允许我指定它不是真的多对多,我可以这样做,但它似乎不允许这样做。做这样的事情的正确方法是什么?

1 个答案:

答案 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)