Django序列化程序使用ForeignKey Relationships访问多个表

时间:2017-03-23 08:16:13

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

我需要使用Django Rest框架构建社交网络后端,其中每个用户都可以看到来自他们的朋友的Feed,这些内容存储在Feeds-Table中。我目前正在使用视图来生成输出。

这是我的models.py

   from django.contrib.auth.models import User
   from django.db import models

   class Friends_list(models.Model):
         profile=models.ForeignKey(User,related_name="user_name")
         friends=models.ForeignKey(User,related_name="friends_name")
         accepted = models.BooleanField(default=False)
         date_of_follow = models.DateTimeField(auto_now=True)

         def __str__(self):
            return self.profile.username


   class Feeds(models.Model):
         author=models.ForeignKey(User,related_name='feed_creator')
         text=models.CharField(max_length=2000,blank=True)
         date_feed=models.DateTimeField(auto_now=True)

         def __str__(self):
         return self.creator.username

这是我的views.py

 class Friends_feed(APIView):
     permissions_class = (IsAuthenticated,)

     def post(self,request):
         user_id=User.objects.get(id=request.POST.get('user_id'))
         friends_list=Friends_list.objects.filter(profile=user_id).values_list('friends',flat=True)
         feedlist={}
         for i in friends_list:
             uu=User.objects.get(id=i)
             friends_data=list(Feeds.objects.filter(author=uu).values_list('id','text','date_feed').order_by('-date_feed')[:1])
             friends_data.insert(0,uu.username)
             feedlist[uu.id]=friends_data
         return Response({'flist':feedlist})      

这就是我的json Response。

   {
    "flist": {
"1": [
  "sakshi",
  [
    4,
    "hey this is me sakshi",
    "2017-03-17T07:05:44.158641Z"
  ]
],
"9": [
  "vivekkk",
  [
    6,
    "my first post on bespal.... hurraay:",
    "2017-03-17T07:06:41.377392Z"
  ]
],
"15": [
  "levis",
  [
    7,
    "my seconf post",
    "2017-03-17T10:00:00.111989Z"
  ]
]
 }
 }

所以我很困惑,如果这是正确的方法,或者有更好的方法在休息框架中使用序列化器。

任何建议或更正都表示赞赏,并提前致谢

EDITS

我也尝试了一些Serializer类,我可以获得所有用户的提要,但是我无法使用Friends_list模型过滤Friends的提要。

serializers.py

    from django.contrib.auth.models import User

    class Fserializer(serializers.ModelSerializer):
      class Meta:
           model=Feeds
           fields=['text','date_feed']


    class Feedserializer(serializers.ModelSerializer):
        feed_creator=Fserializer(many=True)
        class Meta:
           model=User
           fields=['username','feed_creator']

和views.py

   class Friends_feed(APIView):
       serializer_class=Feedserializer
       def post(self,request):
            serializer=Feedserializer(friendsquery,many=True)
            return Response(serializer.data)

在这里我被困在哪里应用过滤器来吸引用户的朋友

1 个答案:

答案 0 :(得分:0)

你可以使用SerializerMethodField ......就像这样......

class Feedserializer(serializers.ModelSerializer):

    field = serializers.SerializerMethodField('get_field_detail')

    def get_field_detail(self, obj):
    '''you can apply your logic here to get required data'''

    try:
        obj = ClassName.objects.get(id=obj.movie.id)
        bj_ser = ClassNameSerializer(obj)
        return crmobj_ser.data
    except:
        return None
不要忘记在meta class fields属性中包含此字段 更多关于serializermethodfield link http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

的信息