Django正确加入多对一关系

时间:2015-12-14 05:36:12

标签: django django-queryset right-join

在我的系统中,我有Account模型,其中包含许多Location,如下所示:

class Account(models.Model):
    # ... also contains billing address data

class Location(models.Model):
    account = models.ForeignKey('Account')
    # ... also contains physical address data

我想创建一个搜索视图,允许用户根据帐单邮寄地址或物理地址搜索Account对象,并将结果显示在一个表中,每个关联的Account个条目Location对象。我无法使用Account模型中的左连接执行此操作;这导致每个Account对象只有一个条目,因此不会覆盖与Location相关联的所有Account个对象(我不关心这些位置)与帐户无关。)

相反,我希望通过从Location模型到Account模型的右连接来执行此操作。这样,所有帐户至少包含一次,并且与其关联的每个位置都包含一次,并且还包括与帐户关联的每个位置。

有没有办法在Django 1.8 +中执行此操作?

编辑:Account对象不需要具有关联的Location个对象,将来可能会Location.account is NULL == True某些Location个对象。

1 个答案:

答案 0 :(得分:0)

事实证明,通过利用Django的through声明来实现多对多关系,我可以更轻松地实现我的目标。我明确定义了链接表:

class AccountLocation(models.Model):
    account = models.ForeignKey(Account)
    location = models.ForeignKey(Location, null=True, blank=True)

...然后我在Account模型上声明LocationAccount之间的关系:

locations = models.ManyToManyField(Location, through='AccountLocation')

最后,我实施了自定义save()delete() logic on the帐户and位置models. The帐户model automatically puts a one-sided entry into帐户位置whenever a new帐户instance is created, and the位置model removes one-sided entries in the link table when a位置instance is created or creates one when the last位置linked to an帐户`已删除。

此解决方案满足我的所有要求,因为我可以使用AccountLocation作为我的搜索表,该表中每个帐户始终至少有一个条目,并且可以对来自两个帐户的数据运行搜索Account模型和Location模型同时出现。

Django不支持右连接,但可以通过其他方式实现相同的结果。