0

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

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

我的课程:

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')
4

1 回答 1

1

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

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

作为旁注,如果您CarTruck类之间的唯一区别是许可证字段的名称,那么它实际上是非常糟糕的设计,因为它实际上无缘无故地违反了 liskov 替换原则。

于 2017-11-02T12:13:34.137 回答