2015-05-04 108 views
0

我想Django Tastypie返回一个由ForeignKey过滤的查询。这里是我的两个型号:Django Tastypie:通过ForeignKey筛选

class Origin(models.Model): 
    country = models.CharField(max_length=1024) 

class Fruits(models.Model): 
    origin  = models.ForeignKey(Origin) 
    fruit_name = models.CharField(max_length=1024) 
    is_sweet = models.BooleanField() 
    quantity = models.IntegerField() 

基于文档here上,我使用以下resources.py:

class FruitResource(ModelResource): 
    class Meta: 
     queryset = Fruits.objects.all() 
     allowed_methods = ['get']  
     filtering = { 
      "origin": ('exact',) 
      } 

这是我想要访问的网址:

http://localhost:8000/api/v1/fruit/?format=json&origin__country=Nepal 

访问这个URL返回以下输出:

{ 
    "meta": 
    { 
     "limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 2}, "objects": 
     [ 
      {"fruit_name": "Apple", "id": 1, "is_sweet": true, "quantity": 10, "resource_uri": "/api/v1/fruit/1/"}, 
      {"fruit_name": "Banana", "id": 2, "is_sweet": true, "quantity": 10, "resource_uri": "/api/v1/fruit/2/"} 
     ] 
} 

我要指出,我用这个URL得到的结果相同:

http://localhost:8000/api/v1/fruit/?format=json 

什么是通过指定的原产地属性来获得水果对象的列表的正确方法?

回答

1

我能够根据this answer得到它的工作。我在这里列出了最终的代码以利于他人。

from tastypie.resources import ModelResource, fields, ALL_WITH_RELATIONS 

from fruits.models import Fruits 
from origin.models import Origin 

class OriginResource(ModelResource): 
    class Meta: 
     queryset = Origin.objects.all() 
     resource_name = 'origin' 
     filtering = { 
      "country": ('exact',) 
      } 

class FruitResource(ModelResource): 
    origin = fields.ForeignKey(OriginResource, 'origin', full=True) 
    class Meta: 
     queryset = Fruits.objects.all() 
     allowed_methods = ['get'] 
     filtering = { 
      "origin": ALL_WITH_RELATIONS, 
      } 

有了这个代码,如果我打http://localhost:8000/api/v1/fruit/?format=json&origin__country=Nepal,我得到如下预期输出:

{"meta": 
    {"limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 1}, 
    "objects": [{ 
     "fruit_name": "Apple", "id": 1, "is_sweet": true, "origin": 
     {"country": "Nepal", "id": 3, "resource_uri": ""}, 
     "quantity": 10, "resource_uri": "/api/v1/fruit/1/" 
    }] 
}