我在为查询集模型编写过滤器时遇到问题:
class Order(models.Model):
items = models.ManyToManyField(OrderLine)
store = models.ForeignKey(Store, blank=True, null=True, on_delete=models.SET_NULL)
class OrderLine(models.Model):
orderItemId = models.IntegerField(blank=False, null=False, unique=True)
quantity = models.IntegerField(blank=True, null=True)
class Store(models.Model):
storeName = models.CharField(max_length=200, blank=True, null=True)
access_from_account = models.ManyToManyField(EDUser, blank=True)
我有我的查询集EDUser">帐户";现在,我想选择属于订单的OrderLines,这些订单来自access_from_account中的帐户可见的Store。
例如:
store_name_1具有access_from_accountuser_1,user_2
store_name_2具有access_from_accountuser_1
订单属于store_name_1。这些订单有许多订单行。我想选择user_1应该可以访问的order_lines。
我可以通过以下方式完成吗:acounts是['user_1']的查询集
lines = OrderLine.objects.filter(order__store__access_from_account__in=accounts)?
我试过了,但我得到了一些奇怪的值。。。
有没有关于如何正确地做这件事的建议?我希望避免列出列表并对其进行迭代。
提前感谢:(
查询
lines = OrderLine.objects.filter(
order__store__access_from_account__in=accounts
)
将正常工作。唯一的问题是,如果accounts
包含两个用户,如user1
和user2
,并且两个帐户都可以访问一个存储,则会重复行。因此,您将检索user1
和user2
的OrderLine
s。这是由于中间连接表上的LEFT OUTER JOIN
。您可以使用.distinct()
[Django-doc]:来解决此问题
lines = OrderLine.objects.filter(
order__store__access_from_account__in=accounts
).distinct()
如果使用单个EDUser
,则不需要__in
查找:
# for asingleuser
lines = OrderLine.objects.filter(
order__store__access_from_account=myuser
)