You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:40:27