Вытягивание и отображение данных из ассоциированной таблицы в рамках Django rest

Я пытаюсь построить API с помощью Django Rest Framework. С которой я не знаком. Я хочу знать, как я могу извлечь данные, используя ссылки и связанные таблицы. У меня есть три модели пользователей, компании и отзывы. Я храню и Auth_token в пользовательской таблице, и я хочу иметь возможность получать отзывы от определенного пользователя, поместив маркер auth в адресной строке.

мои модели

class User(models.Model):
    user_name = models.CharField(max_length=45)
    email = models.CharField(max_length=255)
    auth_Token = models.CharField(max_length=100,default=uuid.uuid4)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

def __str__(self):
    return self.user_name

class Company(models.Model):
    company_name = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

def __str__(self):
    return self.company_name

class Review(models.Model):
    title = models.CharField(max_length=64)
    rating = models.IntegerField(blank=False)
    summary = models.TextField(max_length=10000)
    ip = models.GenericIPAddressField()
    company = models.ForeignKey(Company)
    user = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

def __str__(self):
    return self.title

В настоящее время я могу тянуть отзывы, используя следующий apiview:

class ReviewView(APIView):
    def get(self,request):
        reviews = Review.objects.all()
        serializer = ReviewSerializer(reviews, many=True)
        return Response(serializer.data)

и следующий serilaizer:

 class ReviewSerializer(serializers.ModelSerializer):
     class Meta:
         model = Review
         fields = ('title','company', 'rating', 'summary','user')

Пожалуйста, игнорируйте отступы. Однако это приводит к тому, что я получаю только идентификатор компании и идентификатор пользователя. Я хочу знать две вещи.

Во-первых, как я извлекаю данные, где токен auth передается в качестве url

url(r'^reviews/(?P<auth_Token>[w-]+)/$', ReviewView.as_view()),

и во-вторых, как я отображаю название компании и имя пользователя вместо идентификаторов. Любая помощь была бы великолепна. Спасибо

1 ответ

    1. Как фильтровать отзывы на основе маркера аутентификации пользователя?

    Я предложу использовать a ReadOnlyModelViewSet. Это значительно уменьшит ваш код просмотра и позволит легко фильтровать. Большая часть обыденного и утомительного кода обработки запросов, проверки и так далее уже написана в этих наборах представлений, и поэтому вы можете просто сосредоточиться на вашей бизнес-логике, а не на деталях на стороне сервера.

    Вместо использования auth_Token в самом URL param (например. reviews/XXX/), Я разместил его в качестве запроса param (например. reviews/?auth_Token=XXX). Причина этого заключается в том, что URL-адрес param сам должен возвращать определенный ресурс обзора, но вам нужно вернуть список отфильтрованных обзоров, сопоставленных с одним пользователем.

     from rest_framework import viewsets
    
     class ReviewView(viewsets.ReadOnlyModelViewSet):
        serializer_class = ReviewSerializer
    
    
        def get_queryset(self):
            """
            This function is called whenever someone tries to retrieve reviews. 
            You do not need to worry about serialization or handling the response 
            as the viewset has set that up with your specified serializer_class
            """
    
            auth_Token = self.query_params.get("auth_Token", None)
            if auth_Token: # They provided an auth token so we need to filter.
                reviews = Review.objects.filter(user__auth_Token=auth_Token)
            else:
                 reviews = Review.objects.all()
            return reviews
    

    В вашем urls:

    url(r'^reviews/$', ReviewView.as_view({"get":"list"})),
    
    1. Как показать название компании и имя пользователя в полученных обзорах и не показывать их идентификаторы?

    Вам нужно использовать SlugRelatedField( http://www.django-rest-framework.org/api-guide/relations/#slugrelatedfield ). Это поле позволяет заменить типичный idатрибут другим атрибутом, найденным в связанной таблице. Пожалуйста см. новое ReviewSerializerниже:

    class ReviewSerializer(serializers.ModelSerializer):
    
        company = serializers.SlugRelatedField(read_only=True, slug_field="company_name")
    
        user = serializers.SlugRelatedField(read_only=True, slug_field="user_name")
    
        class Meta:
            model = Review
            fields = ('title','company', 'rating', 'summary','user')