如何将 django 中的查询集转换为 json

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\n
class 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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及一个查询示例:

\n\n
medic = Medic.objects.filter(\n            user_id__city_id=comercial.city_id).select_related('user_id').values()\n
Run Code Online (Sandbox Code Playgroud)\n

Ray*_*nda 6

我\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)\n
Run Code Online (Sandbox Code Playgroud)\n


Wil*_*sem 1

您想要解决的问题基本上有两个:

  1. 序列化关系的数据(the OneToOneField);和
  2. 序列化多个元素。

第一个问题是通过指定相关模型的序列化器来解决的,例如:

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 encoded
Run Code Online (Sandbox Code Playgroud)

注意: a ForeignKeyOneToOneField等通常以后缀结尾_id,因为关系本身是对模型对象的惰性引用,而不是对其主键值的惰性引用。