合并两个或多个查询集或将不同模型合并为一个输出

时间:2019-09-08 11:00:50

标签: python django django-rest-framework

我已经创建了2个模型Images和UserDetails都包含auth_user(用户)的外键字段。如果提供用户ID,则要从3个模型中获取数据。即从用户,用户详细信息和图像作为DRF中的查询集

models.py

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

class Images(models.Model):
    name = models.CharField(max_length=10)
    userid = models.ForeignKey(User,on_delete=models.CASCADE)
    category = models.CharField(max_length=10)
    file = models.FileField(blank=True, null=True)

class Categories(models.Model):
    name = models.CharField(max_length=15)

class Skills(models.Model):
    name = models.CharField(max_length=20)
    category = models.ManyToManyField(Categories)

class UserDetails(models.Model):
    userid = models.ForeignKey(User,on_delete=models.CASCADE)
    firebase = models.CharField(max_length=50)
    mobile = models.IntegerField()
    pin = models.IntegerField( null=True)
    latitude = models.CharField(max_length=50,null=True)
    longitude = models.CharField(max_length=50,null=True)
    profile_pic = models.ManyToManyField(Images,null=True)
    skill = models.ManyToManyField(Skills,null=True)
    is_freelancer = models.IntegerField()

serializer.py

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Images
        fields = '__all__'

views.py

class Profile(ListAPIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (TokenAuthentication,)
    serializer_class = ImageSerializer

    def get_queryset(self):
        img = Images.objects.filter(userid=self.request.user.id)
        return img

如果我在邮递员中运行它,我会得到

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 2,
            "name": "",
            "category": "profile pic",
            "file": "http://127.0.0.1:8000/media/media/brand_EqkvDFf.png",
            "userid": 14
        }
    ]
}

但是我想输出类似这样的东西

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "image": {
                        "id": 2,
                        "name": "",
                        "category": "profile pic",
                        "file": "http://127.0.0.1:8000/media/media/brand_EqkvDFf.png",
                        "userid": 14
             },

            "User": {
                        "id": 2,
                        "username": "Jasir",
                        .
                        .
                        .
             },

             "Details": {

                        "mobile": 7736663588,
                        "palce": "Kerala",
                        .
                        .
                        .
             },

    ]
}

这样的事情,如何有效地做到呢?

我尝试了原始查询,也尝试了管道方法,但仅适用于相同模型

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的需求,则可以使用\ link来满足您的需求。为此,我们还需要两个名为serializer.methodField()UserSerializer的串行器。

所以我们的UserDetailsSerializer会像这样

serializers.py

您将收到这样的答复

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'


class UserDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserDetails
        fields = '__all__'



class ImageSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    details = serializers.SerializerMethodField()
    class Meta:
        model = Images
        fields = '__all__'


    def get_user(self, obj):
        user_instance = User.objects.get(id=obj.userid)
        response = UserSerializer(user_instance)
        return response.data

    def get_details(self, obj):
        user_details = UserDetails.objects.get(userid=obj.userid)
        response = UserDetailsSerializer(user_details)
        return response.data
相关问题