获取所有外键字段

时间:2018-09-08 05:56:42

标签: python django django-models django-rest-framework

我有3个模型。一种模型是用户模型,另一种是发布模型,另一种是通知模型。我想使用Django的REST框架显示已登录用户的所有通知,以及与已登录用户进行交互的每个用户。

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 :(得分:3)

将您的视图更改为:

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

或者您可以为actor定义新的序列化器并发布并像这样使用它:

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

        exclude = ('user',)

答案 1 :(得分:0)

您可以为用户和帖子定义序列化程序。您的serializers.py应该是

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

    class Meta:
        model = Notification
        fields = '__all__'

答案 2 :(得分:0)

尝试

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__'
相关问题