【问题标题】:Django rest framework overriding creation rises errorDjango rest框架覆盖创建上升错误
【发布时间】:2018-05-15 10:52:05
【问题描述】:

我试图通过覆盖viewsetperform_create() 方法将模型的字段设置为经过身份验证的用户,但我收到错误消息。

这是我的模型:

class Reservation(models.Model):
    booking = models.CharField(max_length=15, primary_key=True)
    creator = models.ForeignKey(User, on_delete=models.PROTECT, related_name='user_reservations')
    agency = models.ForeignKey('GeneralApp.Agency', on_delete=models.PROTECT, related_name='agency_reservations')
    comment = models.TextField(null=True, blank=True)
    status = models.ForeignKey(ReservationStatus, on_delete=models.PROTECT, related_name='status_reservations')
    arrival_date = models.DateField()
    departure_date = models.DateField()
    register_date = models.DateField(auto_now_add=True)
    confirmation = models.CharField(max_length=15, null=True, blank=True)
    is_invoiced = models.BooleanField(default=False)

    def __str__(self):
        return "[{}]{}".format(self.booking, self.agency)

    def clean(self, *args, **kwargs):
        if self.arrival_date >= self.departure_date:
            raise ValidationError('Departure date must be later than Arrival date.')
        elif self.arrival_date <= timezone.datetime.now().date():
            raise ValidationError('Arraival date must be later than today.')

    def save(self, *args, **kwargs):
        self.full_clean()
        super(Reservation, self).save(*args, **kwargs)

这是我的序列化器:

class ReservationSerializer(serializers.HyperlinkedModelSerializer):
    creator = serializers.ReadOnlyField(source='creator.username')

    class Meta:
        model = models.Reservation
        fields = ('booking', 'creator', 'agency', 'comment', 'status', 'arrival_date', 'departure_date')

这是我的视图集:

class ReservationViewSet(viewsets.ModelViewSet):
    queryset = models.Reservation.objects.all()
    serializer_class = serializers.ReservationSerializer

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

这是我得到的错误:

TypeError at /reservations_manager/reservations/
Got a `TypeError` when calling `Reservation.objects.create()`.
This may be because you have a writable field on the serializer class that is not a valid argument to `Reservation.objects.create()`.
You may need to make the field read-only, or override the ReservationSerializer.create() method to handle this correctly.

我尝试按照http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#associating-snippets-with-users 中的指示进行操作,但显然我做错了。

【问题讨论】:

  • 你试过错误信息中写的内容了吗?

标签: python django django-rest-framework


【解决方案1】:

这只是一个愚蠢的错误:我将字段名称从owner更改为creator,但我忘记在perform_create()方法中更改:

def perform_create(self, serializer):
        serializer.save(creator=self.request.user)

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多