django - 注释在 Django/Tastypie 中被忽略

标签 django annotations tastypie

在我的 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))

我在查询集中生成和注释的那个计数根本不会出现在最终的 JSON 中。最终的 JSON 有一个 total_users 字段(因为我在 ModelResource 中声明了一个),但它为空。我是否遗漏了任何明显的东西来确保通过这样的注释?如果没有,有什么方法可以解决这个问题?

一种方法是在我的模型中创建一个属性,然后将我的 ModelResource 中的 total_users 字段绑定(bind)到该属性。但这可能会导致我从数据库中提取的每个竞赛的计数查询,这并不好。我想在一个注释类型的查询中做到这一点。

最佳答案

好,我知道了。您可以简单地使用可以添加到 ModelResource 的自定义 dehydrate_[field name] 方法。对于每个 ModelResource 字段,Tastypie 会检查您是否指定了 dehydrate_[field name] 方法,如果您指定了,它会在将对象处理成包时调用该方法(然后以 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] 方法返回什么,都将作为该字段的最终值正确存储在该对象的包中,然后正确处理为输出。

关于django - 注释在 Django/Tastypie 中被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460613/

相关文章:

python - 在 Tastypie 中以 JSON 形式返回异常错误

python - 使用 tastypie api 的 pre_save 信号不允许我访问 "instance"字段

django - 为什么 django-guardian 的 allocate_perm 给我一个DoesNotExist 错误?

python - Django:如何对更新 View /表单进行单元测试

具有未定义嵌套列表深度的嵌套列表的Python注释类型

Django Deliciouspie是否创建具有外键的新资源?

django - 从表单中的必填字段标签中删除 (* char)

django - 在 django 中与 cassandra 交互?

java - 当我添加 <mvc :annotation-driven/>, 时,我得到 "Error creating bean"、 "java.lang.IllegalMonitorStateException"

objective-c - Objective-C : (NSSet *)annotationsInMapRect:(MKMapRect) mapRect method returns null value