Python 组合两个或多个queryset或将不同模型组合为单个输出

Python 组合两个或多个queryset或将不同模型组合为单个输出,python,django,django-rest-framework,Python,Django,Django Rest Framework,我已经创建了两个模型图像和UserDetails都包含一个外键字段auth\u user(user)。如果我提供一个用户id,我想从3个模型中获取数据。ie;来自用户、用户详细信息和图像,作为DRF中的查询集 models.py 来自django.contrib.auth.models导入用户 从django.db导入模型 类图像(models.Model): name=models.CharField(最大长度=10) userid=models.ForeignKey(用户,on_delete

我已经创建了两个模型图像和UserDetails都包含一个外键字段
auth\u user
(user)。如果我提供一个用户id,我想从3个模型中获取数据。ie;来自用户、用户详细信息和图像,作为DRF中的查询集

models.py

来自django.contrib.auth.models导入用户
从django.db导入模型
类图像(models.Model):
name=models.CharField(最大长度=10)
userid=models.ForeignKey(用户,on_delete=models.CASCADE)
类别=型号.CharField(最大长度=10)
file=models.FileField(blank=True,null=True)
类别(models.Model):
name=models.CharField(最大长度=15)
课堂技能(models.Model):
name=models.CharField(最大长度=20)
类别=模型。多个多个字段(类别)
类用户详细信息(models.Model):
userid=models.ForeignKey(用户,on_delete=models.CASCADE)
firebase=models.CharField(最大长度=50)
mobile=models.IntegerField()
pin=models.IntegerField(null=True)
latitude=models.CharField(最大长度=50,空值=True)
经度=models.CharField(最大长度=50,空值=True)
profile_pic=models.ManyToManyField(图像,null=True)
skill=models.ManyToManyField(Skills,null=True)
is_frequelorer=models.IntegerField()
序列化程序.py

类ImageSerializer(serializers.ModelSerializer):
类元:
模型=图像
字段='\uuuu所有\uuuu'
views.py

类配置文件(ListAPIView):
权限\类=(已验证,)
身份验证\类=(令牌身份验证)
serializer\u class=图像序列化程序
def get_queryset(自我):
img=Images.objects.filter(userid=self.request.user.id)
返回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",
                        .
                        .
                        .
             },

    ]
}
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
像这样的事情,如何以有效的方式完成


我尝试了原始查询,也尝试了管道方法,但它只适用于同一型号

如果我正确理解您的需要,您可以使用
serializer.methodField()
并实现您的需要。为此,我们需要另外两个序列化程序,分别名为
UserSerializer
UserDetailsSerializer

因此,我们的
serializers.py
将如下所示

{
    "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",
                        .
                        .
                        .
             },

    ]
}
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
你会得到这样的回应

{
    "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


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

             "Details": {

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

    ]
}

@如果是的话,你能接受它作为一个被接受的答案。谢谢你的反馈!声誉低于15的人所投的票将被记录,但不会改变公开显示的帖子分数。当我投票时,发生了这样的事