Django中Booking关联Customer实例时出现ValueError问题求助
Django汽车租赁平台订单关联Customer实例问题解决
问题场景
我正在搭建汽车租赁平台,客户可通过平台下单租车,订单包含车辆、起止日期信息,表单需自动将当前认证用户设为订单创建者。使用CreateView实现的初始代码如下:
class BookingCreate(CreateView): model = Booking fields = ['car', 'start_date', 'end_date'] permission_classes = [permissions.IsAuthenticated] def form_valid(self, form): form.instance.user = self.request.user return super().form_valid(form)
初始错误
表单能正常显示,但提交时触发报错:
ValueError at /rentals/booking/create
Cannot assign "<SimpleLazyObject: <CustomUser: Test2 Two>>": "Booking.user" must be a "Customer" instance.
错误尝试修改
参考相关方案调整代码后:
def form_valid(self, form): form.instance.user = Booking.objects.get(user=self.request.user) return super().form_valid(form)
出现新错误:
ValueError at /rentals/booking/create
Cannot query "Test2 Two": Must be "Customer" instance.
背景模型说明
项目使用自定义CustomUser模型,通过布尔字段标记车主(Owner)和客户(Customer)两种用户类型,核心模型代码如下:
models.py
from accounts.models import CustomUser class User(CustomUser): is_customer = models.BooleanField(default=False) is_owner = models.BooleanField(default=False) class Owner(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) def __str__(self): return self.user.first_name class Customer(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) cars = models.ManyToManyField('Car', blank=True) ... def get_absolute_url(self): return reverse('rental:customer-detail', args=[str(self.id)]) def __str__(self): return f'{ self.user.first_name } { self.user.last_name }' class Booking(models.Model): """存储订单信息,比如创建时间、预订日期、车辆ID等""" # 订单唯一ID id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="自动生成的唯一ID,请勿修改") user = models.ForeignKey('Customer', on_delete=models.SET_NULL, null=True) car = models.ForeignKey(Car, on_delete=models.SET_NULL, null=True) start_date = models.DateField(default=timezone.now) end_date = models.DateField(null=True) ...
最终解决方案
修改form_valid方法,通过当前认证用户的主键关联对应的Customer实例:
def form_valid(self, form): form.instance.user = Customer.objects.get(pk=self.request.user.pk) return super().form_valid(form)
相关参考问题
- ValueError at /post/new/ 无法赋值"<SimpleLazyObject:<User: chetan>>": "Post.author"必须是"User"实例
- 无法赋值"<SimpleLazyObject: <User: XXX>>": "Comment.user"必须是"MyProfile"实例
- 无法赋值"<SimpleLazyObject: <User: JohnDoe12>>": "Profile.user"必须是"User"实例
内容的提问来源于Stack Exchange,提问作者Rene
相关产品推荐
相关产品推荐

