多对一关系上的Django右连接
在我的系统中,我有和多对一关系上的Django右连接,django,django-queryset,right-join,Django,Django Queryset,Right Join,在我的系统中,我有和账户模型,其中有许多位置s,如下所示: class Account(models.Model): # ... also contains billing address data class Location(models.Model): account = models.ForeignKey('Account') # ... also contains physical address data 我想创建一个搜索视图,允许用户根据账单地址或物理地
账户
模型,其中有许多位置
s,如下所示:
class Account(models.Model):
# ... also contains billing address data
class Location(models.Model):
account = models.ForeignKey('Account')
# ... also contains physical address data
我想创建一个搜索视图,允许用户根据账单地址或物理地址搜索帐户
对象,并将结果显示在一个表中,每个关联的位置
对象都有一个帐户
条目。我不能从帐户模型中使用左连接;这导致每个帐户
对象都有一个条目,因此不包括与帐户
关联的所有位置
对象(我不关心与帐户无关的位置)
相反,我想通过从位置
模型到帐户
模型的右连接来实现这一点。这样,所有帐户都至少包含一次,并且每个与帐户关联的位置都包含一次,与帐户关联的每个位置也包含一次
在Django 1.8+中有没有办法做到这一点
编辑:Account
对象不需要关联位置
对象,将来可能会出现这样的情况,对于一些Location
对象,Location.account为NULL==True
。事实证明,通过对多对多关系的声明,利用Django的,可以更容易地实现我的目标。我明确定义了链接表:
class AccountLocation(models.Model):
account = models.ForeignKey(Account)
location = models.ForeignKey(Location, null=True, blank=True)
…然后我在帐户
模型上声明帐户
和位置
之间的关系:
locations = models.ManyToManyField(Location, through='AccountLocation')
最后,我在
Account和
Location模型上实现了自定义的save()
和delete()逻辑。每当创建新的
Account实例时,
Account模型会自动将单面条目放入
AccountLocation,而
Location模型在创建
Location实例时删除链接表中的单面条目,或者在删除链接到
帐户的最后一个
Location实例时创建单面条目
此解决方案满足我的所有要求,因为我可以使用AccountLocation
作为我的搜索表,对于每个帐户,该表中始终至少有一个条目,并且可以同时对帐户
模型和位置
模型的数据运行搜索
Django不支持右连接,但可以通过其他方式实现相同的结果