0

在我的系统中,我的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对象可能会出现这种情况。

4

1 回答 1

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 intoAccountLocationwhenever 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 不支持右连接,但可以通过其他方式实现相同的结果。

于 2016-01-23T17:25:56.480 回答