2015-07-20 2 views
0

Существуют две таблицы user, phone, которые связаны промежуточной таблицей owner. Здесь цель состоит в том, чтобы использовать Rest API для получения всех телефонов от конкретного пользователя, http://127.0.0.1/users/alice/phones/.Получить атрибуты отношений с API REST Django

Я использую ModelSerializer как сериализатор и ViewSet как вид. Пожалуйста, дайте мне знать, как это сделать? Я понятия не имею, как направить /users/user_name/phones/, чтобы получить телефоны от конкретного пользователя. Спасибо.

Фрагмент кода:

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model=User 

class PhoneSerializer(serializers.ModelSerializer): 
    class Meta: 
     model=Phone 

class OwnerSerializer(serializers.ModelSerializer): 
    class Meta: 
     model=Owner 
     depth=1 

// views 
class UserViewSet(viewsets.ModelViewSet): 

    queryset=User.objects.all() 
    serializer_class=UserSerializer 


class PhoneViewSet(viewsets.ModelViewSet): 

    queryset=Phone.objects.all() 
    serializer_class=PhoneSerializer 

.... 
+0

Важно ли использовать этот URL: '/ users/user_name/phones /', или вы можете использовать этот «/ phones /? User = user_name'? –

+0

/users/user_name/phones/and/phones /? User = user_name оба будут в порядке. Тем не менее, первый больше похож на стиль отдыха. – frogcd

ответ

0

Я предлагаю вам создать filter.

Это будет что-то вроде этого:

1) Создать фильтр (Убедитесь, что django-filter установлен):.

# filters.py 
import django_filters 


class PhoneFilter(django_filters.FilterSet): 

    user = django_filters.Filter(name="user__user_name") 

    class Meta: 
     model = Phone 
     fields = ('user',) 

2) Добавить фильтр к вашему Viewset:

# views.py 
class PhoneViewSet(viewsets.ModelViewSet): 

    queryset=Phone.objects.all() 
    serializer_class=PhoneSerializer 
    filter_backends = (filters.DjangoFilterBackend,) 
    filter_class = filters.PhoneFilter 

И теперь вы можете использовать этот адрес: /phones/?user=user_name.

+0

Спасибо. Как использовать/user/user_name/телефоны для телефонов от пользователя? Официальное лицо Django заявляет: «Если у вас есть специальные методы, к которым нужно перенаправить, вы можете пометить их как требующие маршрутизации с помощью декораторов detail_route или list_route. Декоратор detail_route содержит pk в своем шаблоне URL и предназначен для методов которые требуют одного экземпляра. Декоратор list_route предназначен для методов, которые работают с списком объектов ». – frogcd

0

Используйте @detail_route для маршрутизации URL вашей функции, например,

@detail_route(methods=['get']) 
def phones(self, request, pk=None): 
    pass 

http://127.0.0.1/users/alice/phones будет работать!

Смежные вопросы