在我的系统中,我有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
个对象。
答案 0 :(得分:0)
事实证明,通过利用Django的through
声明来实现多对多关系,我可以更轻松地实现我的目标。我明确定义了链接表:
class AccountLocation(models.Model):
account = models.ForeignKey(Account)
location = models.ForeignKey(Location, null=True, blank=True)
...然后我在Account
模型上声明Location
和Account
之间的关系:
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不支持右连接,但可以通过其他方式实现相同的结果。