来自继承自 models.Model 的类的 python 子类

标签 python django class subclass abstract

我这里有些疑惑...

假设我有 3 个类:

class CarSpec(models.Model):
    x = models.IntegerField(default=20)
    y = models.CharField(max_length=100, blank=True)
    z = models.CharField(max_length=50, blank=True)
    chassis = models.ForeignKey(Chassis, unique=True, limit_choices_to={'type':'A'})
    car_brand = models.CharField(max_length=100, blank=True)
    car_model = models.CharField(max_length=50, blank=True)
    number_of_doors = models.IntegerField(default=2)

class MotoSpec(models.Model):
    x = models.IntegerField(default=20)
    y = models.CharField(max_length=100, blank=True)
    z = models.CharField(max_length=50, blank=True)
    chassis = models.ForeignKey(Chassis, unique=True, limit_choices_to={'type':'C'})
    motor_brand = models.CharField(max_length=100, blank=True)
    motor_model = models.CharField(max_length=50, blank=True)
    powered_weels = models.IntegerField(default=1)

class Chassis(models.Model):
    name = models.CharField(max_length=50, blank=False)
    type = models.CharField(max_length=2, choices = GAME_TYPES, default="A")

GAME_TYPES = (('A', 'Car'),('B', 'Truck'),('C', 'Motorcycle'))

我正在使用这 3 个类,但在我的应用程序中,我必须始终检查 chassis 类型,以便对每种情况应用一些业务规则...... 我认为这不是正确的方法。所以我计划这样做:

class Spec(models.Model):
    x = models.IntegerField(default=20)
    y = models.CharField(max_length=100, blank=True)
    z = models.CharField(max_length=50, blank=True)

    class Meta:
        abstract = True

并且有两个子类:

class CarSpec(Spec):
    chassis = models.ForeignKey(Chassis, unique=True, limit_choices_to={'type':'A'})
    car_brand = models.CharField(max_length=100, blank=True)
    car_model = models.CharField(max_length=50, blank=True)
    number_of_doors = models.IntegerField(default=2)

class MotoSpec(Spec):
    chassis = models.ForeignKey(Chassis, unique=True, limit_choices_to={'type':'C'})
    motor_brand = models.CharField(max_length=100, blank=True)
    motor_model = models.CharField(max_length=50, blank=True)
    powered_weels = models.IntegerField(default=1)

class Chassis(models.Model):
    name = models.CharField(max_length=50, blank=False)
    type = models.CharField(max_length=2, choices = GAME_TYPES, default="A")

GAME_TYPES = (('A', 'Car'),('B', 'Truck'),('C', 'Motorcycle'))

好的,直到这里一切正常,在我的应用程序中没有改变任何与以前的类一起工作的东西,并且所有对象都按照预期很好地保存在数据库中..

但是,我的问题仍然存在……因为我继续实例化 CarSpec 和 MotoSpec 而不是 Spec……但是……我想一直使用 Spec 而不是扩展类……如此,我该怎么办能够实例化一个 Spec 对象,将 Chassis 传递给他的 init 方法,以便从该(或其他)方法获取 CarSpec 或 MotoSpec..

已编辑-重要:我为 MotoSpec 添加了 powered_weels 属性,为 CarSpec 添加了 number_of_doors 因为我有两个 Specs 中的每一个的一些特定字段

再次编辑:在我看来,我想避免每次乱搞 Specs 时都进行类型验证,并将其留给所涉及的类之一。恢复,我希望能够添加一个新的规范对象,而不必担心更改我的 View ..只有与规范相关的对象..

# CarSpec
if game_type == "A":
    stuff = CarSpec.restore_state(request, game_session)
# MotoSpec
elif game_type == "C":
    stuff = MotoSpec.restore_state(request, game_session)

已编辑:我在我的 Spec 类上添加了一个 restore_state,但后来我想我发现了一些与循环导入相关的问题。天哪。这让我很痛苦。我有 .NET 背景,而 python 在这类事情上对我来说并不容易 :S

最佳答案

将 chasis、brand 和 model 属性添加到 Spec 类,然后使用 proxy models对于 CarSpec 和 MotoSpec 类,可以添加 car_brand()、motor_brand() 等方法...

关于来自继承自 models.Model 的类的 python 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14755357/

相关文章:

Django 测试 RequestFactory 与 Client

python - 不能在django模板中使用unicode字符串

c# - 类中的 ASP.Net C# ResolveClientUrl

java - 我们是否在 UML 类图中的两个类中应用相同的操作?

python - 无法将字符串转换为 float : 'Product_0332'

java - 使用Python解决方案无法在JAVA中处理,因为执行速度慢

django-filter: TypeError at/goods/__init__() 得到一个意外的关键字参数 'name'

iphone - Objective-C类的问题?

python - 类型 'tensorflow.python.framework.ops.EagerTensor' 没有 len()

python - 在python中编写或编写二进制文件以将数据保存到文件中?