Получение всех полей внешнего ключа - PullRequest
0 голосов
/ 08 сентября 2018

у меня 3 модели. Одна модель - это модель User, другая - модель Post, а другая - модель уведомлений. Я хочу использовать инфраструктуру REST Django, чтобы показать все уведомления для вошедшего в систему пользователя, а также для каждого пользователя, который взаимодействовал с вошедшим в систему пользователем.

class Notification(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE, related_name='actors')
    actor       = models.ForeignKey(User, on_delete=models.CASCADE, related_name='users') 
    post        = models.ForeignKey(Post, on_delete=models.CASCADE, blank=True, null=True)
    type        = models.ForeignKey(NotifType, on_delete=models.CASCADE)
    is_read     = models.BooleanField()
    created_at  = models.DateTimeField(auto_now_add=True)

class Post(models.Model):
    user            = models.ForeignKey(User, on_delete=models.CASCADE)
    status          = models.CharField(max_length=200)
    share_count     = models.IntegerField(default=0)
    created_at      = models.DateTimeField(auto_now_add=True)
    url             = models.CharField(max_length=150)

serializers.py

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

        fields = '__all__'

views.py

class GetNotifications(ListAPIView):
    serializer_class = NotificationSerializer
    def get_queryset(self):
        user = get_object_or_404(User, id=self.request.user.id)
        return User.objects.select_related().filter(users__user=user).order_by("-users__created_at")

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

{
  "post": {
     "id": 1,
     "status": "Hello!",
      .
      .
      .
   },
   "user": {
      "username": "Ben",
      "avatar": "example.png"
      .
      .
   },
   is_read: 1,
   created_at: 2017-07-21,
   type: 2
}

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

попробуйте

class NotificationSerial(serializers.ModelSerializer):
    class Meta:
        model = Notification

        fields = '__all__'

class PostSerial(serializers.ModelSerializer):
    class Meta:
        model = Post

        fields = '__all__'

class NotificationSerializer(serializers.ModelSerializer):
    post = PostSerial(many=True, source='post_set')
    user = NotificationSerial(many=True, source='actors')

    class Meta:
        model = User
        fields = '__all__'
0 голосов
/ 08 сентября 2018

изменить свой взгляд как:

class GetNotifications(ListAPIView):
    serializer_class = NotificationSerializer
    def get_queryset(self):
        ## user = get_object_or_404(User, id=self.request.user.id)
        ## i believe the above line is redundant, you can use self.request.user to access the loged-in user
        return Notification.objects.select_related().filter(user=self.request.user).order_by("created_at")

затем измените сериализатор уведомлений на:

class NotificationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notification

        exclude = ('user',)
        depth = 1

или вы можете определить новый сериализатор для актера и поста и использовать его следующим образом:

class NotificationSerializer(serializers.ModelSerializer):
    actor = ActorSerializer()
    post = PostSerializer()
    class Meta:
        model = Notification

        exclude = ('user',)
0 голосов
/ 08 сентября 2018

Вы определяете сериализатор для пользователя и постов. Ваш serializers.py должен быть

class NotificationSerializer(serializers.ModelSerializer):
    post = PostSerializer()
    user = UserSerializer()

    class Meta:
        model = Notification
        fields = '__all__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...