2015-05-04 3 views
0

Я бы хотел, чтобы Django Tastypie возвращал запрос, отфильтрованный ForeignKey. Вот мои две модели:Django Tastypie: Filtering by 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',) 
      } 

Это URL я пытаюсь получить доступ к:

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 

Что такое правильный способ получить список объектов, Фрукты, указав атрибут страны в Origin?

ответ

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/" 
    }] 
} 
Смежные вопросы