Django和使用大量连接编写查询

Django和使用大量连接编写查询,django,django-models,Django,Django Models,我很难用大量的连接进行此类查询。我没有找到例子,但我想它们写起来并不复杂。只是有几个FK 这是models.py(不复杂) 模型的快速描述 用户可以是客户端(使用CliProfile)或企业(使用BizProfile) 每张卡都链接到一个客户端 每张卡都包含一个[积分-业务]关联 这样:客户有一张卡,在必胜客有3分,在麦当劳有5分) 我试图编写的请求 从功能上讲,其目的是让店主(如比萨屋)可以看到所有客户(在比萨屋有积分卡的客户) 从技术上讲,我试图编写一个查询来获取所有客户机(即CliPr

我很难用大量的连接进行此类查询。我没有找到例子,但我想它们写起来并不复杂。只是有几个FK

这是models.py(不复杂)

模型的快速描述

  • 用户可以是客户端(使用CliProfile)或企业(使用BizProfile)
  • 每张卡都链接到一个客户端
  • 每张卡都包含一个[积分-业务]关联
这样:客户有一张卡,在必胜客有3分,在麦当劳有5分)

我试图编写的请求

从功能上讲,其目的是让店主(如比萨屋)可以看到所有客户(在比萨屋有积分卡的客户)

从技术上讲,我试图编写一个查询来获取所有客户机(即CliProfile查询集),这些客户机的卡(至少1张)的点数(至少1张)的所有者(只有1张)的用户(只有1张)=request.user


你知道怎么写这样的查询吗?非常感谢。

要匹配filter()中模型内的字段,需要使用两个下划线。以下几点对我有用

CliProfile.objects.filter(card__points__at_owner=request.user)
但是@Alex的建议是最有意义的,除非这只是你想做的一个例子

如果需要与多张卡中的一张相关联的配置文件,可以使用:

此外,在中不使用==。这将返回True或False,然后在filter()调用中传递该值,从而有效地使调用筛选器(True或False)不起任何作用。必须使用=,因为要将命名参数传递到筛选函数中

为什么是卡片而不是卡片集()? 购物车集合仅存在于CliProfile的实例中。您不在CliProfile的实例中,您正在尝试获取它们的列表

您可以在终端中尝试,它将告诉您有效的选择

#Note that it doesn't matter what you put after=, since it fails before that is checked.
>>> CliProfile.objects.filter(card_set=True)
FieldError: Cannot resolve keyword 'card_set' into field. Choices are: card, id, user
一个CliProfile可以被多张卡引用,这就是为什么其中存在card_set,但您试图匹配一张卡的原因。
卡的
指向所有者的
字段是
请求。用户


您可以使用
a\u cliprofile\u instance.card\u set.filter()
来获取他们的卡的子集,或者
a\u cliprofile\u instance.card\u set.all()
来显示他们的所有卡

对不起,澄清一下——您正在尝试获取
cliprofile
谁的
用户
=
请求。用户
?如果是这样,为什么不直接获取它,然后使用该对象查询相关对象呢?i、 e.
client=CliProfile.objects.get(user=request.user)
。同样,这些一对一关系将创建一个反向关系,因此您可以只使用user。cliprofile@Alex我不想这样做,这很容易:)正如我试图解释的,是客户的卡(有几个)的点(有几个)其bizprofile(有一个)的用户(有一个)=请求。user@DavidW. 你从什么信息开始?
请求用户
,对吗?你想从中得到什么信息,那些与用户相关的卡片(通过各种关系)?@Alex:input:request.user(确实)。需要输出:CliProfile对象的queryset(不完全是您所说的卡片,但无论如何我需要这些卡片来获取CliProfile)card_集合包含0->N个卡片对象。点集合包含0->N个点对象。您确定这种情况下的语法吗?我想,如果卡片和积分是一对一的关系,它会起作用,但这是一个一对一的关系。我在我的回答中添加了一个解释。卡片集只包含0->N张卡片。它只存在于CliProfile的实例中。您不能使用它来筛选CliProfile,因为您在制作CliProfile.objects.filter()调用时不在其中。感谢所有这些解释!我试过你的建议。不幸的是,
CliProfile.objects.filter(card\u points\u at\u owner=request.user)
无法工作,因为它无法将关键字“card”解析到字段中。您能为我的示例添加使用
方法中的
的正确方法吗?在我的例子中,我仍然不明白该怎么做:(谢谢你的帮助。我不确定在你的例子中应该是什么
卡片
:在我的模型中没有这样命名的属性,它们应该如何解析?
CliProfile.objects.filter(card__in=IterableOfCards)
#Note that it doesn't matter what you put after=, since it fails before that is checked.
>>> CliProfile.objects.filter(card_set=True)
FieldError: Cannot resolve keyword 'card_set' into field. Choices are: card, id, user