【问题标题】:Django: a model instance for every possible combination of 2 other model instancesDjango:一个模型实例,用于两个其他模型实例的每个可能组合
【发布时间】:2019-01-25 09:33:30
【问题描述】:

我有一个用户模型,其外键指示用户所属的组。用户可以订购服务。服务的价格取决于它是哪种服务以及用户属于哪个组。服务和组的数量可以更改,但我始终需要为每个可能的服务组组合定价。

class User(models.Model):
    name = models.CharField()
    group = models.Foreignkey(Group)

class Group(models.Model):
    group_name = models.CharField()

class Order(models.Model):
    user = models.Foreignkey(User)
    type = models.Foreignkey(Service)

class Service(models.Model):
    type = models.CharField()

似乎我不能简单地将价格字段添加到服务模型中,因为相同服务的价格与组一样多。

问题 1: 我应该将价格存储在哪种模型中? 我在想以下几点:

class Price(models.Model):
    service = models.Foreignkey(Service)
    group = models.Foreignkey(Group)
    price = models.DecimalField()

这是一个明智的策略吗?

问题 2:只有管理员才能创建新组或服务,但是当发生这种情况时,我需要确保在 Django 的管理界面中以某种方式在创建新服务时,表单也为每个组询问不同的价格,反之亦然,如果创建了一个新组,表格还应该询问所有服务的价格。除此之外,最好确保每个唯一的服务组组合只能有一个 Price 实例。

【问题讨论】:

  • 不同的价格是否总是可以作为公式推导出来的?例如如果是第 1 组,*5。价格,如果是第 2 组,*2 价格?
  • @gregory 我明白你的意思,如果它背后有一个固定的公式,你可以将价格存储在 Service 模型中,并将一个因素存储在 Group 模型中,从而使问题变得微不足道。但是让我们说不,价格可以是完全任意的
  • 好的,那么是的,你的 Price 类是相当明智的。

标签: python django database model


【解决方案1】:

对于问题 2,我需要设置新组(或服务)表单中的价格。您可以使用一个必填的下拉字段,其中填充了价格查询。小组形式的草图可以说明这一点:

class groupForm(forms.ModelForm):
    price = forms.ModelChoiceField(queryset=None, empty_label=None, required=True)
    ...
     def __init__(self, *args, **kwargs):
        super(groupForm, self).__init__(*args, **kwargs)
        self.fields['price'].queryset = self.instance.price_set.all()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-02-20
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多