Как преобразовать набор запросов в Django в JSON - PullRequest
0 голосов
/ 25 января 2019

Я видел, что на его вопрос отвечали несколько раз для django <2.xx, но для текущей версии, которую я использую (2.1), я не смог преобразовать мои наборы запросов в формат json. Я пробовал сериализатор с использованием инфраструктуры отдыха django, но пока единственное использование, которое мне удалось реализовать, - это сериализация модели, поэтому, когда мои наборы запросов имеют результаты из разных моделей, это не работает. </p>

Это действительно раздражает. В таких фреймворках, как Laravel, это должно быть довольно просто, я был бы признателен за любую помощь.

class Medic(models.Model):
    objects = models.Manager()
    user_id = models.OneToOneField(User, on_delete=models.DO_NOTHING)
    points = models.PositiveIntegerField(default=0)
    validated = models.BooleanField(default=0)
    qualification = models.PositiveIntegerField(
        default=0, validators=[MaxValueValidator(10)])
    referral_code = models.CharField(max_length=10)
    profesional_license = models.CharField(max_length=20)

class CustomUser(AbstractUser):
    # add additional fields in here
    first_name2 = models.CharField(default='', max_length=20)
    last_name2 = models.CharField(default='', max_length=20)
    dni = models.CharField(max_length=20)
    cell = models.CharField(max_length=10)
    role = models.CharField(max_length=45)
    city_id = models.ForeignKey(City, on_delete=models.DO_NOTHING)

И пример запроса:

medic = Medic.objects.filter(
            user_id__city_id=comercial.city_id).select_related('user_id').values()

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я попробовал сериализатор, используя Django rest Framework , вам не нужен rest-Framework для сериализации QuerySet, вы можете:

# This is according to your example, I, really can't imagine 
#, why you're saying you have a queryset having results from
# different models. If you're using QuerySet.union, or some similar
# feature, serialize QuerySets before join them.
from django.core.serializers import json

medic = Medic.objects.filter(
            user_id__city_id=comercial.city_id).select_related('user_id').values()

json_serializer = json.Serializer()
json_serialized = json_serializer.serialize(medic)
0 голосов
/ 25 января 2019

Есть две основные проблемы, которые вы хотите решить:

  1. сериализация данных отношения (OneToOneField); и
  2. сериализация несколько элементов.

Первая проблема решается путем указания сериализатора связанной модели, например:

class CustomUserSerializer(ModelSerializer):

    class Meta:
        model = CustomUser
        fields = '__all__'

class CustomUserSerializer(ModelSerializer):

    user = <b>CustomUserSerializer(source='user_id', read_only=True)</b>

    class Meta:
        model = Medic
        fields = '__all__'

Если вы создали сериализатор 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<b>, many=True</b>)
    return JSONResponse({'data': serializer.data})  # the data, now JSON encoded

Примечание : a ForeignKey, OneToOneField и т. Д. Обычно не заканчиваются суффиксом _id, поскольку само отношение является ленивой ссылкой на модель объект, а не его первичное значение ключа.

...