在我的Tastypie资源中,我正在注释我的查询集,但我没有看到注释流向JSON Tastypie生成并传回。 代码很简单:

class CompetitionResource(ModelResource):
    total_tickets = fields.IntegerField(readonly=True)

    class Meta:
        queryset = Competition.objects.all().annotate(total_tickets=Count('ticket__ticketownership__user__id', distinct=True))

我在我的查询集中生成和注释的Count只是没有显示在最终的JSON中。 最终的JSON有一个total_users字段(因为我在ModelResource中声明了一个),但它是null。 我是否遗漏了任何明显的东西以确保这样的注释得以通过? 如果没有,那么解决这个问题的方法是什么?

一种方法是在我的Model中创建一个属性,然后将ModelResource中的total_users字段绑定到该属性。 但这可能会导致我从数据库中抽取的每个竞赛的Count查询,这并不好。 我想在一个注释类型查询中执行此操作。

#1楼 票数:5 已采纳

好,我知道了。 您可以简单地使用可添加到ModelResource的自定义dehydrate_ [字段名称]方法。 对于每个ModelResource字段,Tastypie检查你是否指定了一个dehydrate_ [field name]方法,如果你这样做了,那么当它将一个对象处理成一个bundle(然后以JSON或XML或其他形式输出)时,它会调用该方法。 对于该特定对象,此dehydrate_ [field name]方法获取Tastypie为此之前创建的包。 好处是这个bundle在bundle.obj下有原始对象。 该对象仍将具有您在get_object_list中提供的原始注释(如上面的答案所示)。 所以你可以使用以下代码。

class CompetitionResource(ModelResource):
    total_tickets = fields.IntegerField(readonly=True)

    class Meta:
        queryset = Competition.objects.all()

    def get_object_list(self, request):
        return super(CompetitionResource, self).get_object_list(request).annotate(total_tickets=Count('ticket__ticketownership__user__id', distinct=True))

    def dehydrate_total_tickets(self, bundle):
        return bundle.obj.total_tickets

无论您从自定义的dehydrate_ [field name]方法返回什么,都将正确存储为该字段在该对象的包中的最终值,然后正确处理为输出。

#2楼 票数:0

它没有出现在文档中,但是查看源代码时,有一个属性参数可以传递给字段声明,该声明可以用于将其绑定到模型实例的属性。

可选地接受attribute ,该attribute应该是实例属性的字符串,或者在dehydrate期间可以从对象调用,或者在hydrate期间将数据推送到对象上。 默认为None ,表示将手动访问数据。

因此,对于您的示例,以下应该可以解决问题。

class CompetitionResource(ModelResource):
    total_tickets = fields.IntegerField(readonly=True, attribute='total_tickets')

    class Meta:
        queryset = Competition.objects.all().annotate(total_tickets=Count('ticket__ticketownership__user__id', distinct=True))

脱水解决方案适用于使用值填充发送的对象,但不允许您轻松利用Tastypie的一些其他功能,如内置过滤(我相信排序)。 使用带有属性参数的字段定义。

#3楼 票数:-1

我认为你的问题可能与在Tastypie文档给定的警告queryset

如果你在其中放置任何callable,它们将只被评估一次(当Meta类被实例化时)。 这尤其会影响与日期/时间相关的事物。 请参阅:ref:cookbook来解决这个问题。

看一下食谱中的相关部分 ,我想你应该尝试这样的事情:

class CompetitionResource(ModelResource):
    total_users = fields.IntegerField(readonly=True)

    class Meta:
        queryset = Competition.objects.all()

    def get_object_list(self, request):
        return super(CompetitionResource, self).get_object_list(request).annotate(total_tickets=Count('ticket__ticketownership__user__id', distinct=True))

  ask by Mario translate from so

未解决问题?本站智能推荐:

1回复

如何在Django / Tastypie中处理多对多

我有以下两个模型,它们之间应该有多对多的关系: 我对django和tastypie完全陌生,我有两个问题: 1)在Blueprint和Workload之间指定多对多的正确语法是什么,因此在创建新的Blueprint记录时,它不会遇到数据库约束,抱怨相关的Workload记录不能为空
1回复

如何在Django / Tastypie中处理动作?

我正在编写一个Web应用程序,目的是充当应用程序和Amazon API之间的中间层。 我认为可以使用REST风格的API,并选择了Deliciouspie来简化实现。 我创建了一个名为Instance的模型,并创建了一个Deliciouspie资源。 为了简单起见,假设对该资源的PUT
1回复

Django-tastypie中的字段有什么作用?

在tastypie资源中定义字段有什么意义? 我看了文档 在设计API时,一个重要的组件是定义您正在呈现的数据的表示。 与Django模型一样,您可以使用字段控制资源的表示。 各种类型的数据有多种字段。 它是什么意思,“定义代表”?
1回复

更改django-tastypie-swagger中的基本URL

我有一个在端口62022上运行Gunicorn的Django站点,以及在端口62090上运行的Nginx。向外界开放的端口是62090(Nginx在其中监听)。 问题在于django-tastypie-swagger认为基本URL是http:// localhost:62022 /,并且由于该
1回复

Django / Tastypie中的单元测试

我正在尝试对我的好吃的应用程序进行一些测试,但出现以下错误。 我是否需要在settings.py的installed_apps部分添加内容? 还是我的测试需要放在其他地方? 现在,我正在使用启动新的Django项目时所获得的基本结构,而我的测试在tests.py上 OK,所以我
1回复

无法按Django / tastypie中的关系进行过滤

鉴于: 请注意,我试图仅检索is_void = False的checktoitem记录。 但是,将返回所有记录(而不仅仅是非无效记录)。 有什么帮助吗? 我尝试在几个地方添加过滤器,但没有任何效果。
1回复

在django-tastypie中返回POST数据

我认为对象创建函数返回新创建的对象是标准。 所以,任何想法你如何在tastypie做到这一点? 当我发送POST请求时,创建了对象,但我没有得到任何响应。 我想要的是接收新创建的对象(或至少PK)的JSON形式。 我尝试重写dehydrate方法,但它似乎甚至在POST时都没有被
3回复

在django-tastypie中获得认证的用户

我只是从Python和Django开始,然后使用tastypie创建RESTful API。 我需要基于经过身份验证的用户来计算资源的字段,我计划在资源中覆盖dehydrate_field方法,但是我不知道如何在dehydrate_field方法中获取经过身份验证的用户。 我正在使用