【问题标题】:Django validate column combination existence (Unique with boolean field)Django 验证列组合是否存在(具有布尔字段的唯一性)
【发布时间】:2016-07-01 00:06:00
【问题描述】:

我使用的是 Django 1.9。我有一个简单的模型:

#Goods
class Goods(models.Model):
    code = models.CharField(max_length=50)
    decription = models.CharField(max_length=100)
    ...etc

#Vendors
class Vendors(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    ...etc

还有一个类来定义多个厂商获取一个好。

#Purchase_options
class PurchaseOptions(models.Model):
    preferred_vendor = models.BooleanField()
    vendor = models.ForeignKey(Vendors)
    good = models.ForeignKey(Goods)

问题来了: 如何确保可以将特定商品的只有一个供应商设置为首选?

表格上接受的值:

**Vendor | Product | Preferred**
  V_01   | Good_01 | True
  V_02   | Good_01 | False
  V_03   | Good_01 | False
  V_02   | Good_02 | True
  V_04   | Good_02 | False

表格上的值错误:

**Vendor | Product | Preferred**
  V_01   | Good_01 | True
  V_02   | Good_01 | **True**  <-There's already a preferred vendor.
  V_03   | Good_01 | False
  V_02   | Good_02 | True
  V_04   | Good_02 | False

我正在使用 Django 的管理界面来填充 Puchase_Options 上的数据。 我试过这个:

1) 定义一个验证器,在给定首选值和产品 ID 的情况下,检查该组合是否存在于表中:

def validator(preferred, id):
    if Purchase_Option.objects.filter(good.id=id,preferred_vendor=preferred).exists():
        Raise ValidationError("There's already a preferred vendor defined for this product")

但它告诉我对象 Purchase_Options 不存在。我相信我实际上无法在验证器函数中查询数据库或处理查询集。

2) 我尝试使用元属性 unique-together("preferred_vendor","good_id")。除了我必须允许 False + Good_Id 的多种组合(因为我有很多非首选供应商)之外,这将起作用......但只有 True+Good_id 的 1 个组合.

我真的不知道还能尝试什么,我真的很期待听到您的想法。你之前曾多次救过我 :D

【问题讨论】:

    标签: python django validation model


    【解决方案1】:

    您可以将NullBooleanField 用于preferred_vendor,将unique_together 用于preferred_vendorgood。对一个首选供应商使用True,对所有其他供应商使用NULL 而不是False

    这将允许您拥有多对 (good, NULL) 和仅一对 (good,True)。缺点是您也只能拥有一对 (good,False),但这应该不是问题。

    例如:

    class PurchaseOptions(models.Model):
        preferred_vendor = models.NullBooleanField()
        vendor = models.ForeignKey(Vendors)
        good = models.ForeignKey(Goods)
    
        class Meta:
            unique_together = ("preferred_vendor", "good")
    

    然后:

      Vendor | Product | Preferred
      V_01   | Good_01 | True
      V_02   | Good_01 | NULL
      V_03   | Good_01 | NULL
      V_02   | Good_02 | True
      V_04   | Good_02 | NULL
    

    【讨论】:

    • 尼基塔,你的方法有效。所以我真的很感激。尽管我对您的问题感到满意,但我会将这个问题再讨论一段时间以允许任何其他选择。为什么good和null的组合不是重复的?我真的不明白。
    • 太棒了!实际上,我没有研究您的问题是否重复,我只是想出了一个想法并发布了它。所以可能有一些类似的问题,但如果没有,那么这肯定会帮助其他人。
    • 不,伙计,不要误会我的意思。我不是说你的答案是重复的,也许我没有正确表达自己。我的意思是在 SQL 和 Django 方面。 .. 为什么 True+Good 和 False + Good 只允许一种组合,而 NULL+Good 允许多种组合.. 我根本不明白。谢谢!!!
    • 我明白了,据说任何NULL 都被认为不等于其他NULL,所以它可以用于唯一约束。但是允许NULL 是唯一的可能是一个实现特性,即依赖于数据库,但我不确定这一点。
    • 谢谢你...我会把你的答案标记为好。祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多