Django Rest Framework-无法序列化查询集 [英] Django rest framework - cant serialize query set

查看:57
本文介绍了Django Rest Framework-无法序列化查询集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试序列化查询集

def do(self):
        reservations = Reservation.objects.all()
        serializer = ReservationSerializer(data=reservations, many=True)
        if serializer.is_valid():
            encoded_data = json.dumps(serializer.data)
            r = requests.post('http://httpbin.org/post', headers={'Content-Type': 'application/json'}, data=encoded_data)
            print(r.text)
        else:
            print(serializer.errors)

我总是得到

{u'non_field_errors':[u'期望项目列表,但类型为"QuerySet".']}

{u'non_field_errors': [u'Expected a list of items but got type "QuerySet".']}

我尝试在查询集上使用 values(),然后转换为列表,但是这样我得到的对象没有嵌套模型

I tried to use values() on query set, and then convert to list, but this way I get objects without nested models

模型

class Reservation(models.Model):
    start = models.DateField(verbose_name='Заезд', auto_now=False, auto_now_add=False, blank=False)
    end = models.DateField(verbose_name='Выезд', auto_now=False, auto_now_add=False, blank=False)
    check_in_time = models.TimeField(verbose_name='Время заезда', blank=False)
    check_out_time = models.TimeField(verbose_name='Время выезда', blank=False)
    has_refund = models.BooleanField(verbose_name='Возвратная бронь', default=True)
    payed = models.BooleanField(verbose_name='Оплачено', default=False)
    reserved_days = models.ManyToManyField(Day, blank=False)
    additional_services = models.ManyToManyField(AdditionalService)
    guest_name = models.CharField(verbose_name='Имя гостя', max_length=200, blank=True)
    reservation_number = models.CharField(verbose_name='Номер брони', max_length=200, blank=True)

class AdditionalService(models.Model):
    payment_date = models.CharField(verbose_name='Дата оплаты', max_length=200, blank=True)
    payment_type = models.CharField(verbose_name='Форма оплаты', max_length=200, blank=False)
    service = models.CharField(verbose_name='Услуга', max_length=200, blank=False)
    quantity = models.IntegerField(blank=False)
    price = models.FloatField(blank=False)

class Day(models.Model):
    date = models.DateField(auto_now=False, auto_now_add=False)
    price = models.FloatField()
    payment_method = models.CharField(max_length = 200, blank=True)
    payment_date = models.CharField(max_length=200, blank=True)
    room = models.ForeignKey(Room, null=True, blank=True, verbose_name='Номер', on_delete=models.CASCADE)

class Room(models.Model):
    name = models.CharField(max_length = 200, null=True)
    id = models.AutoField(primary_key=True)
    room_id = models.CharField(max_length = 200, null=False)

    def __unicode__(self):
        return self.name

序列化器

class ReservationSerializer(serializers.ModelSerializer):
    reserved_days = DaySerializer(many=True)
    additional_services = AdditionalServicesSerializer(many=True)

    class Meta:
        model = Reservation
        fields = [
            'start',
            'end',
            'check_in_time',
            'check_out_time',
            'reserved_days',
            'additional_services',
            'has_refund',
            'payed',
            'guest_name',
            'reservation_number',
        ]

class DaySerializer(serializers.ModelSerializer):
    room = RoomSerializer()

    class Meta:
        model = Day
        fields = [
            'date',
            'price',
            'payment_method',
            'payment_date',
            'room',
        ]

class AdditionalServicesSerializer(serializers.ModelSerializer):
    class Meta:
        model = AdditionalService
        fields = [
            'payment_date',
            'payment_type',
            'service',
            'quantity',
            'price',
        ]

class RoomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Room
        fields = [
            'room_id',
        ]

推荐答案

对于序列化,您无需使用 data 关键字,只需将queryset作为第一个位置参数传递即可:

For serialization you don't need to use data keyword, just pass queryset as first positional argument:

serializer = ReservationSerializer(reservations, many=True)
return serializer.data

这篇关于Django Rest Framework-无法序列化查询集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆