我刚刚从1.6升级到1.8,我发现了一个奇怪的错误。我似乎无法将sql查询生成的字段显示在数据库行中,如下所示:
class UserAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = models.User.objects.annotate(invited_count=Count('invitations'))
qs = qs.extra({
'average_invite_count': '(SELECT \
(SELECT COUNT(ei.id) FROM events_invitation ei \
WHERE ei.event_id IN (SELECT ee.id FROM events_event ee \
WHERE ee.owner_id = users_user.id)) \
/ NULLIF(COUNT(ee.id), 0) FROM events_event ee \
WHERE ee.owner_id = users_user.id)',
})
return qs
def average_invite_count(self, obj):
"""
Returns the count of created events.
"""
return obj.average_invite_count
average_invite_count.short_description = 'Created events'
average_invite_count.admin_order_field = 'average_invite_count'
list_display = ('phone_number', 'email', 'full_name', 'average_invite_count')
注意:我认为堆栈溢出的引用存在问题
答案 0 :(得分:0)
使用此方法作为最后的手段
这是一个旧的API,我们打算在将来的某个时候弃用。仅在您无法使用其他
queryset
方法表达查询时才使用它。如果您确实需要使用它,请在您的用例中使用QuerySet.extra
关键字提交票证(请先检查现有票证列表),以便我们可以增强QuerySet API以允许删除extra()。我们不再改进或修复此方法的错误。
对.extra
的支持在1.8中被明确删除,甚至在1.7中也不赞成。
我只建议您使用annotation
queryset方法重新编写,然后仅在必要时使用RawSQL
。 Django现在功能非常强大,因此您可以通过aggregation
s,F()
expressions和ExpressionWrapper
s完成所需的操作。