Django:基于现有对象的模型

2024-04-25 16:52:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Django和编程都是新手。到目前为止,我只需要参考官方文件就可以建立一个网站,但现在我被卡住了。我将用加油站类比来描述我的问题。你知道吗

这就是我得到的:

class Grade(models.Model):
    grade_name = models.CharField(max_length=30)

class Station(models.Model):
    station_name = models.CharField(max_length=30)
    gas_grade = models.ManyToManyField(Grade)

用它我创建了三个等级的对象:普通的,加号的,高级的。之后,我创建了几个站,我“分配”任何等级组合。容易的。你知道吗

当我需要价格时问题就开始了。一个明显的解决方案是增加价格模型:

class Price(models.Model):
    station = models.ForeignKey(Station, on_delete=models.CASCADE)

    price_regular = models.CharField(max_length=30)
    price_plus = models.CharField(max_length=30)
    price_premium = models.CharField(max_length=30)

但至少可以说,手动添加最后三个字段并不有趣。我的“成绩”和“站”可以每天增长。它们还有两个表示最小/最大价格的字段。你知道吗

所以。。。 我可以基于现有对象动态创建字段吗? 关键是我需要每个新的站有一个为每个等级分配的价格字段。你知道吗

请告知我的任何选择。

我已经快一个星期没打死人了。也许我还没弄明白,因为我遵循的逻辑是错误的?你知道吗

也许Django admin之外的专用“添加站点”表单可以工作?但我认为这需要大量的javascript参与。你知道吗

谢谢你。你知道吗


Tags: 对象djangonamemodelmodels价格lengthprice
2条回答

您可以将等级和价格视为电视台提供的产品的属性:

class Station(models.Model):
    station_name = models.CharField(max_length=30)


class ProductOffer(models.Model):
    GRADE = (
        ('regular', 'Regular'),
        ('plus', 'Plus'),
        ('premium', 'Premium'),
    )
    station = models.ForeignKey(Station)
    value = models.DecimalField()
    grade = models.CharField(max_length=30, choices=GRADE)

以上有几个优点:

  • 使用气体等级常数,以避免低变化率和低基数(如气体类型)的模型。这避免了额外的表和额外的连接。你知道吗
  • 单个外键避免了多对多(除了其他不便外,它们在引擎盖下使用了一个中间表,因此又使用了一个额外的表和额外的连接)

你需要在ManyToManyField中使用intermediate model。价格数据在这里。所以:

class Grade(models.Model):
    grade_name = models.CharField(max_length=30)

class Station(models.Model):
    station_name = models.CharField(max_length=30)
    gas_grade = models.ManyToManyField(Grade, through='StationGrade')

class StationGrade(models.Model):
    station = models.ForeignKey(Station, on_delete=models.CASCADE)
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE)

    price = models.CharField(max_length=30)

相关问题 更多 >