django - 如何使用 django-query 以更动态的方式获取我的 api
问题描述
模型.py
from django.db import models
class SeekerRegister(models.Model):
seeker_name = models.CharField(max_length=32)
seeker_email = models.CharField(max_length=32)
class Social(models.Model):
social_links = models.CharField(max_length=256)
user = models.ForeignKey(access_models.SeekerRegister,on_delete=models.CASCADE,related_name='social',null=True,blank=True)
我的查询:
def custom_seeker_api(request):
obj = list(SeekerRegister.objects.values('seeker_name','seeker_email',
'social__social_links','social__user',
))
return JsonResponse(obj,safe=False)
得到:
[
{
"seeker_name": "soubhagya",
"seeker_email": "soubhagya.developer@gmail.com",
"social__social_links": "facebook.com/soubhagya",
"social__user": 11
},
{
"seeker_name": "soubhagya",
"seeker_email": "soubhagya.developer@gmail.com",
"social__social_links": "twitter.com/soubhagya",
"social__user": 11
},
{
"seeker_name": "soubhagya",
"seeker_email": "soubhagya.developer@gmail.com",
"social__social_links": "linkedin.com/soubhagya",
"social__user": 11
}
]
期待:
[
{
"seeker_name": "soubhagya",
"seeker_email": "soubhagya.developer@gmail.com",
"social": [
{
"social_links":"linkedin.com/soubhagya",
"user": 11
},
{
"social_links":"twitter.com/soubhagya",
"user": 11
},
{
"social_links":"linkedin.com/soubhagya",
"user": 11
}
]
}
]
当我写我的查询时,我以第一种方式得到结果。意味着如果一个用户共享多个社交详细信息,那么它应该仅与同一用户一起显示在列表中
在这里,我期待我的 api 使用 django-query 的第二种方式,请查看我的代码。
解决方案
您可以使用DRF来获得这种行为。例如:
# serializer
class SocialSerializer(serializers.ModelSerializer):
class Meta:
model = Social
fields = (
'social_links',
)
class SeekerRegisterSerializer(serializers.ModelSerializer):
social = serializers.SerializerMethodField()
class Meta:
model = SeekerRegister
fields = (
'id', # inplace of user, because this data is related to SeekerRegister, not Social Model
'social',
'seeker_name',
'seeker_email',
)
def get_social(self, obj):
return SocialSerializer(
obj.social.all(),
many=True,
read_only=True
).data
# view
class SocialView(APIView):
def get(self, request):
serializer = SeekerRegisterSerializer(SeekerRegister.objects.all(), many=True)
return Response(serializer.data)
# url
path('/social/', SocialView.as_view())
但是如果你不想使用 DRF,那么你可以这样做:
resp_list = []
for seekreg in SeekerRegister.objects.all():
_resp = dict()
_resp['seeker_name'] = seekreg.seeker_name
_resp['seeker_email'] = seekreg.seeker_email
_resp['user'] = seekreg.id # user info is related to SeekerRegister not Social model
_resp['social'] = seekreg.social.values('social_links')
resp_list.append(_resp)
return JsonResponse(resp_list,safe=False)
仅供参考:您无法直接从 django-query 获得此响应,因此您需要为此使用 for-loop。
推荐阅读
- git - Bitbake,从 git 构建但不是最新提交
- java - 使用 Gson 解析嵌套的 json 值
- android - 服务活动的意图附加功能
- java - 如何使用警报管理器设置通知
- robotframework - 错误:当尝试在 %0 和注释部分输入值时,元素必须是用户可编辑的,以便在机器人框架中清除它
- java - org.springframework.web.client.RestTemplate 期望被声明为@Bean 和普通的@Autowired 抛出错误
- powershell - 获取电子邮件广告属性以匹配给定广告用户名列表
- python - 在 tkinter python 中处理多个条目
- javascript - SyntaxError:Gulpfile.js 中的意外标记
- android - 应用清单必须包含元数据 com.google.ar.core android sceneform AR