2017-03-08 96 views
0

我需要在Django中表示多个一对多关系。也就是说,给定几个不同的模型,我需要这些中的每个与单个表具有一对多关系。从逻辑上讲,该关系属于“拥有”一对多关系的模型,但是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是非空的。如果ManyToManyField允许我指定它不是真的多对多,我可以这样做,但它似乎不允许。什么是正确的方式来做这样的事情?

回答

1

你可以使用generic relations到您的接收器模型与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)