django查询集在1.8中不起作用

时间:2016-02-18 00:08:45

标签: sql django

我刚刚从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')

注意:我认为堆栈溢出的引用存在问题

1 个答案:

答案 0 :(得分:0)

From the Documentation

  

使用此方法作为最后的手段

     

这是一个旧的API,我们打算在将来的某个时候弃用。仅在您无法使用其他queryset方法表达查询时才使用它。如果您确实需要使用它,请在您的用例中使用QuerySet.extra关键字提交票证(请先检查现有票证列表),以便我们可以增强QuerySet API以允许删除extra()。我们不再改进或修复此方法的错误。

.extra的支持在1.8中被明确删除,甚至在1.7中也不赞成。

我只建议您使用annotation queryset方法重新编写,然后仅在必要时使用RawSQL 。 Django现在功能非常强大,因此您可以通过aggregationsF() expressionsExpressionWrappers完成所需的操作。