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

时间:2017-11-02 11:53:15

标签: python django django-models django-generic-views django-polymorphic

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

我使用UpdateView进行更新,但它随机从vehicle_list获取vehicle_id。我必须控制这种型号的车型。但我不能。

我的课程:

pipeline

在视图中:

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

顺便说一句,我尝试使用“isinstance()”但它没有用。也许这是关于PolymorphicModel,我不知道。

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

1 个答案:

答案 0 :(得分:1)

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

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

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