【问题标题】:Tastypie 'Search' Only Returns Resource NameTastypie 'Search' 仅返回资源名称
【发布时间】:2013-12-30 22:32:04
【问题描述】:

我正在尝试创建一个通过 ForeingKey 字段(或者更确切地说是字段中引用的对象)过滤对象的函数。我编写了下面包含的函数,它基于 Tastypie Cookbook 的添加搜索功能。该函数确实可以返回对象,但它仅将对象的名称作为字符串返回。

这是调用函数的结果:

{'receipt_items': [<ReceiptItem: Item1>, <ReceiptItem: Item2>, <ReceiptItem: Item3>]}

这是我的资源:

class ReceiptItemResource(ModelResource):
receipt = fields.ToOneField(ReceiptResource, 'receipt', full = True)
class Meta:
    queryset = ReceiptItem.objects.all()
    serializer = Serializer()
    allowed_methods = ['get', 'post', 'put', 'delete']
    always_return_data = True

def prepend_urls(self):
    return [
        url(r'^(?P<resource_name>%s)/filter%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('filter_by_receipt'), name = 'filter_by_receipt'),

        ]

def filter_by_receipt(self, request, **kwargs):
    data = self.deserialize(request, request.body, format = request.META.get('CONTENT_TYPE', 'application/json'))

    receipt_id = data.get('receipt_id', '')
    print receipt_id

    receipt = Receipt.objects.get(id = receipt_id)

    receipt_items = ReceiptItem.objects.filter(receipt = receipt)

    item_list = {
        'receipt_items' : receipt_items,
    }

    print item_list
    return self.create_response(request, receipt_items)

    #return super(ReceiptItemResource, self).get_object_list(request).filter(receipt = receipt)

def get_object_list(self, request):
    user = request.user
    member = user.member
    owner = member.owner


    return super(ReceiptItemResource, self).get_object_list(request).filter(owner = owner)

理想情况下,我希望此函数以 JSON 格式返回完整的对象详细信息。有什么办法可以做到这一点?

我已经研究了 Tastypie 的资源过滤,但是我不相信这会起作用,因为我试图过滤的字段是 ForeignKey。

非常感谢所有帮助,谢谢。

【问题讨论】:

    标签: python django api tastypie


    【解决方案1】:

    您不需要这样做。您可以使用过滤选项默认过滤 foreignKey

    from tastypie.resources import ALL, ALL_WITH_RELATIONS
    
    class RecieptResource(ModelResource):
        class Meta: 
           fields = ["id"]
           filtering = {
             "id": ALL
           }
    
    class ReceiptItemResource(ModelResource):
        receipt = fields.ToOneField(ReceiptResource, 'receipt', full = True)
        class Meta:
            queryset = ReceiptItem.objects.all()
            allowed_methods = ['get', 'post', 'put', 'delete']
            always_return_data = True
            filtering = {
                "reciept": ALL_WITH_RELATIONS
            }
    

    现在以下应该 url(取决于你如何配置)应该给你你想要的

    /api/v1/reciept-item/?receipt__id=1&format=json

    【讨论】:

    • 返回ImportError: cannot import name All_WITH_RELATIONS,我似乎在网上找不到任何关于此错误的信息。
    • 打错字了...用 ALL_WITH_RELATIONS 代替 All_WITH_RELATIONS
    • 修复了导入错误,但是现在它正在工作,我得到了No JSON object could be decoded error
    • 尝试删除 'serializer = Serializer()' 行。序列化程序应默认设置。我对引用的代码进行了更改。
    • 在尝试后问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多