понимание того, что делают сериализаторы и как они делают, а также где я могу зарегистрировать свой запрос в случае представлений на основе классов - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть этот код, который для моих взглядов

class QuestionViewSet(viewsets.ModelViewSet):
    queryset=Question.objects.all()
    lookup_field="slug"
    serializer_class=QuestionSerializer
    permission_classes=[IsAuthorOrReadOnly,IsAuthenticated]
    def perform_create(self, serializer):
        print("user is", self.request.user)
        serializer.save(author=self.request.user)

и этот код для сериализаторов


   class QuestionSerializer(serializers.ModelSerializer):
   author = serializers.StringRelatedField(read_only=True)
   created_at = serializers.SerializerMethodField()
   slug = serializers.SlugField(read_only=True)
   answers_count = serializers.SerializerMethodField()
   user_has_answered = serializers.SerializerMethodField()
   print("author in serializer", author)
   class Meta:
       model = Question
       exclude = ["updated_at"]

   def get_created_at(self, instance):
       return instance.created_at.strftime("%B %d, %Y")

   def get_answers_count(self, instance):
       return instance.answers.count()

   def get_user_has_answered(self, instance):
       request = self.context.get("request")
       return instance.answers.filter(author=request.user).exists()

Тогда у меня есть этот код для моделей

    class Question(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    content = models.CharField(max_length=240)
    slug = models.SlugField(max_length=255, unique=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,
                               on_delete=models.CASCADE,
                               related_name="questions")
    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.slug = slugify(self.content)

        super(Question, self).save(*args, **kwargs)

Что я в основном не могу сделать, так это зарегистрировать запрос. В случае функции на основе я мог бы легко зарегистрировать запрос и посмотреть, какие данные поступают. Кроме того, я не понимаю, где данные сохраняются в случае пост-запроса. Я не вижу ничего, кроме как c. Просветите пожалуйста как это нормально работает?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

вместо переопределения диспетчеризации, лучшее решение - написать промежуточное программное обеспечение, которое регистрирует данные запроса.

https://docs.djangoproject.com/en/3.0/topics/http/middleware/

lass SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response
0 голосов
/ 10 февраля 2020

Для регистрации данных запроса вы можете переопределить метод отправки:

class QuestionViewSet(viewsets.ModelViewSet):    
    def dispatch(self, request, *args, **kwargs)
    # log the request here
    return super().dispatch(request, *args, **kwargs)

Также вы можете рассмотреть возможность использования чего-то более «широкого», например, установки собственной midlleware .

Что касается создания - волхвы c происходит в методе создания набора. Вы также можете переопределить его:

def create(self, request, *args, **kwargs):
    # do something unusual here
...