【问题标题】:How do I hard-code a type into my models in Django如何在 Django 中将类型硬编码到我的模型中
【发布时间】:2012-07-16 19:44:47
【问题描述】:

以下是模型的逻辑:

  1. 类别。有几个类别;每个类别可以包含多个产品。
  2. 产品。有几种产品;每个产品只能有一个类别。

是否可以在模型文件本身中指定每个产品的类别?例如:我可以设置模型,使shirt 只能是clothing 而不能是别的吗?

这是我到目前为止所拥有的(它没有验证):

class Category(models.Model):
   CATEGORY_CHOICES = (
        ('CLOTHING', 'Clothing'),
        ('FURNITURE', 'Furniture'),
   )
   category = models.CharField(choices=CATEGORY_CHOICES)


class Shirt(Product):
    category = models.ForeignKey(Category, default=CATEGORY_CHOICES.CLOTHING)

    class Table(Product):
       category = models.ForeignKey(Category, default=CATEGORY_CHOICES.FURNITURE)

我是新手。感谢您的帮助!

【问题讨论】:

  • 这个级别的验证应该在代码中完成。
  • 我同意@Sid,硬编码这种东西会变得很复杂,而且不是很巧妙的设计,这属于模型,可能是表单验证

标签: database django django-models relational-database foreign-key-relationship


【解决方案1】:

您可以使用任意规则在保存时验证您的模型。因此,编写一个验证规则来检查所有衬衫是否都保存在服装类别中。

对于用户输入,创建一个只提供与产品对应的选项的表单。

祝你好运!

【讨论】:

  • 感谢您的意见!快速澄清问题:那么是否有必要拥有一个 Category 类?或者我可以确定一个方法,例如 def category(self) 来指定该特定模型的类别可以是什么?
  • 如果您要验证它们,似乎您需要在某处定义允许的产品类别。如果我这样做,我将创建一个方法,该方法返回给定产品的允许类别,并用它填充显示表单中的选择字段。我可能也会将验证作为检查。
【解决方案2】:

我建议你花一些时间来采用最近添加的 model validation,虽然它不是自动的表单验证(你必须自己调用 clean* 方法,可能在 save 内部),你会得到 DRY 验证可用于模型和表单级别。

【讨论】:

    【解决方案3】:

    您可以使用可调用对象将实例作为默认值

    类似这样的东西(未经测试的代码):

    class Shirt(Product):
    
      def getClothingInstance():
        return Category.objects.get(category=Category.CATEGORY_CHOISES['CLOTHING'])
    
      category = models.ForeignKey(Category, default=getClothingInstance)
    

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多