在通用视图中将 PolymorphicModel 类对象控制为模型

Controlling PolymorphicModel classed object as model in Generic view

我有一个名为 Vehicle 的 PolymorphicModel class,我从中派生了两个 class:Car 和 Truck。

我使用 UpdateView 进行更新,但它随机从 vehicle_list 获取 vehicle_id。而且我必须控制这个模型是哪种类型的车辆。但是我做不到。

我的class是:

class Vehicle(PolymorphicModel):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, verbose_name="ID")


class Car(Vehicle):
    car_license = models.CharField(max_length=32)


class Truck(Vehicle):
    truck_license = models.CharField(max_length=32)

可见:

class VehicleUpdate(UpdateView):
    car = object
    if car.car_license is not None:
        model = Car
    else:
        model = Truck
    fields = '__all__'

    def get_success_url(self, **kwargs):
        return reverse_lazy('person-list')

但是它给出了这个错误:

AttributeError: type object 'object' has no attribute 'tr_id'

顺便说一句,我尝试使用 "isinstance()" 但它没有用。可能是关于成为 PolymorphicModel,我不知道。

class VehicleUpdate(UpdateView):
    if isinstance(object, Car):
        model = Car
    else:
        model = Truck
    fields = '__all__'

    def get_success_url(self, **kwargs):
        return reverse_lazy('person-list')

class 顶层的代码(在函数定义之外)在执行 class 语句时执行 - 通常(=> 当 class 被定义时在模块的顶层),当模块被导入时。这意味着在这一点上,object 很可能是内置的 object class,或者之前在模块中绑定到名称 "object" 的任何内容,并且绝对不是Vehicle 实例。

我很少使用基于 class 的视图(大多数情况下,普通函数视图比 CBV 更容易编写/读取/修改)并且从不使用通用 CBV,所以我不能可以肯定地说,但从文档看来,尝试从当前实例设置 class 的 model 属性(self.object - 当然只能通过方法使用)是行不通的工作,因为获取此实例的机制依赖于 model 属性...

附带说明一下,如果 CarTruck classes 之间的唯一区别是许可证字段的名称,那么它的设计真的很糟糕,因为它实际上无缘无故地违反了 liskov 替换原则。