Django休息框架 - 无法序列化查询集

Ale*_*y K 3 django 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)
Run Code Online (Sandbox Code Playgroud)

我总是得到错误

{u'non_field_errors':[u'expected一个项目列表,但得到类型"QuerySet".']}

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

模型

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

串行

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',
        ]
Run Code Online (Sandbox Code Playgroud)

nev*_*ner 10

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

serializer = ReservationSerializer(reservations, many=True)
return serializer.data
Run Code Online (Sandbox Code Playgroud)