- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个 Django 应用程序,我有一个显示 object_set
两侧的 View (反向多对多)。因此,我想同时查询两侧的所有对象。具体来说,我希望拥有与每个 Event
关联的所有 Signup
对象。
(查看页面格式应该是这样的。)
Event (0)
-- Signup (0.0)
-- Signup (0.1)
-- Signup (0.2)
-- Signup (0.3)
Event (1)
-- Signup (1.0)
-- Signup (1.1)
Event (3)
-- Signup (3.0)
-- Signup (3.1)
-- Signup (3.2)
-- Signup (3.3)
...
代码如下:
class TournamentDetailView(DetailView):
model = Tournament
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
tournament_id = self.get_object().pk
events = Event.objects.annotate(
cached_signups=(
Signup.objects
.filter(event_id=OuterRef('pk'), tournament_id=tournament_id, dropped=False)
.order_by('created')
.defer('tournament')
)
).all()
context['events'] = events
return context
这是回溯:
Traceback:
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\generic\detail.py" in get
106. context = self.get_context_data(object=self.object)
File "C:\Users\werdn\PycharmProjects\gwspo-signups-website\gwhs_speech_and_debate\tournament_signups\views.py" in get_context_data
171. .defer('tournament')
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\werdn\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py" in annotate
1000. if alias in annotations and annotation.contains_aggregate:
Exception Type: AttributeError at /tournaments/detail/lobo-howl/
Exception Value: 'Query' object has no attribute 'contains_aggregate'
我不确定为什么会发生这种情况,它似乎发生在 Signups.objects
查询中,但即使使用 Signups.objects.all()
,这异常似乎被触发。这让我相信这不是使用 OuterRef('pk')
的问题。
最佳答案
你不能只把一个Query
放在一个annotation
里面,因为一个annotation
就像是在行中添加一个列取。 Django 在注解中支持 Subquery
的概念,但这仅在您获取相关模型的一个聚合值时才有效。这会起作用,例如:
signups = Signup.objects
.filter(event_id=OuterRef('pk'), tournament_id=tournament_id, dropped=False)
.order_by('created')
.defer('tournament')
events = Event.objects.annotate(latest_signup=Subquery(signups.values('date')[:-1]))
如果你只是想优化数据库访问,这样你就不会为每个 Event
进行数据库查询来获取相关的 Signup
,你应该使用 prefetch_related
:
events = Event.objects.all().prefetch_related('signups')
由于您没有展示您的模型是如何定义的,我假设这是一个反向的 M2M 关系:
class Signup(models.Model):
events = models.ManyToManyField(to='Event', related_name='signups')
如果您不指定 related_name
,则用于预取的属性是 signup_set
(它没有在任何地方记录并且非常困惑,因为对于聚合它是小写的型号名称):
events = Event.objects.all().prefetch_related('signup_set')
这将进行两次查询:一次针对 Event
对象,一次额外针对所有相关的 Signup
对象(而不是 Event.objects.count ()
查询)。 documentation for prefetch_related
包含有关其工作原理的一些有用信息。
关于python - 属性错误 : 'Query' object has no attribute 'contains_aggregate' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52337608/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!