我已经创建了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",
.
.
.
},
]
}
这样的事情,如何有效地做到呢?
我尝试了原始查询,也尝试了管道方法,但仅适用于相同模型
答案 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