Python 组合两个或多个queryset或将不同模型组合为单个输出
我已经创建了两个模型图像和UserDetails都包含一个外键字段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
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的人所投的票将被记录,但不会改变公开显示的帖子分数。当我投票时,发生了这样的事