Jua*_*ara 5 django django-rest-framework
我\xc2\xb4ve 看到他的问题已在django < 2.xx 中多次得到解答,但对于我使用的当前版本(2.1),我\xc2\xb4been 无法将我的查询集转换为json 格式。我\xc2\xb4ve尝试使用django Rest框架进行序列化,但到目前为止,我能够实现的唯一用途是序列化模型,因此当我的查询集具有来自不同模型的结果时,该结果不起作用。
\n\n这真的很烦人,在 Laravel 这样的框架中,这应该非常简单,我将不胜感激。
\n\nclass Medic(models.Model):\n objects = models.Manager()\n user_id = models.OneToOneField(User, on_delete=models.DO_NOTHING)\n points = models.PositiveIntegerField(default=0)\n validated = models.BooleanField(default=0)\n qualification = models.PositiveIntegerField(\n default=0, validators=[MaxValueValidator(10)])\n referral_code = models.CharField(max_length=10)\n profesional_license = models.CharField(max_length=20)\n\nclass CustomUser(AbstractUser):\n # add additional fields in here\n first_name2 = models.CharField(default='', max_length=20)\n last_name2 = models.CharField(default='', max_length=20)\n dni = models.CharField(max_length=20)\n cell = models.CharField(max_length=10)\n role = models.CharField(max_length=45)\n city_id = models.ForeignKey(City, on_delete=models.DO_NOTHING)\nRun Code Online (Sandbox Code Playgroud)\n\n以及一个查询示例:
\n\nmedic = Medic.objects.filter(\n user_id__city_id=comercial.city_id).select_related('user_id').values()\nRun Code Online (Sandbox Code Playgroud)\n
我\xc2\xb4ve尝试使用Django休息框架序列化器,你不需要休息框架来序列化查询集,你可以:
\n\n# This is according to your example, I, really can't imagine \n#, why you're saying you have a queryset having results from\n# different models. If you're using QuerySet.union, or some similar\n# feature, serialize QuerySets before join them.\nfrom django.core.serializers import json\n\nmedic = Medic.objects.filter(\n user_id__city_id=comercial.city_id).select_related('user_id')\n\njson_serializer = json.Serializer()\njson_serialized = json_serializer.serialize(medic)\nRun Code Online (Sandbox Code Playgroud)\n
您想要解决的问题基本上有两个:
OneToOneField);和第一个问题是通过指定相关模型的序列化器来解决的,例如:
class CustomUserSerializer(ModelSerializer):
class Meta:
model = CustomUser
fields = '__all__'
class CustomUserSerializer(ModelSerializer):
user = CustomUserSerializer(source='user_id', read_only=True)
class Meta:
model = Medic
fields = '__all__'Run Code Online (Sandbox Code Playgroud)
MedicSerializer如果您已经为模型构建了序列化器Medic,则可以通过将many=...参数设置为 来序列化它True。
例如:
def some_view(request):
queryset = Medic.objects.filter(
user_id__city_id=comercial.city_id
).select_related('user_id')
serializer = MedicSerializer(queryset, many=True)
return JSONResponse({'data': serializer.data}) # the data, now JSON encodedRun Code Online (Sandbox Code Playgroud)
注意: a
ForeignKey、OneToOneField等通常不以后缀结尾_id,因为关系本身是对模型对象的惰性引用,而不是对其主键值的惰性引用。
| 归档时间: |
|
| 查看次数: |
7427 次 |
| 最近记录: |