在通用视图中将 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
属性...
附带说明一下,如果 Car
和 Truck
classes 之间的唯一区别是许可证字段的名称,那么它的设计真的很糟糕,因为它实际上无缘无故地违反了 liskov 替换原则。
我有一个名为 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
属性...
附带说明一下,如果 Car
和 Truck
classes 之间的唯一区别是许可证字段的名称,那么它的设计真的很糟糕,因为它实际上无缘无故地违反了 liskov 替换原则。