【问题标题】:Constraining a django Many-to-Many Relationship using unique_together使用 unique_together 约束 django 多对多关系
【发布时间】:2011-07-13 23:50:58
【问题描述】:

我认为这可能比 Django 更多 SQL,但 Django 是我正在工作的。我想做的是想出一个对象模型,它可以有许多属性,但每个属性类型仅限于 1 个目的。

假设我们有 3 种属性类型:

  • is_cool
  • is_happy
  • is_mean

假设我有一个对象 (MyObject),它可以应用 * (0-All) 的这些属性,但每个属性只有一个。

所以我认为这个图表如下(如果我错了请纠正我):

在 Django 中,我正在努力解决这个限制。我想要它在数据库级别,即使用unique_together

这就是我所拥有的......

PROP_VALUE_CHOICES = (("URL", "url"),
                      ("Boolean", "bool"),
                      ("String", "char"),
                      ("Person", "person"))

class PropertyType(models.Model):
    name = models.CharField(max_length=32)
    value_type = models.CharField(max_length=32, choices=PROP_VALUE_CHOICES)

class Property(models.Model):
    type = models.ForeignKey(PropertyType)
    value = models.CharField(max_length=32)

class MyObjectA(models.Model):
    properties = models.ManyToManyField(Property, related_name="MyObjectA")

class MyObjectB(models.Model):
    properties = models.ManyToManyField(Property, related_name="MyObjectB")

所以问题:

  1. 上图是记录我想要完成的工作的正确方法吗?
  2. 我的模型不完整 - 我缺少什么以及在哪里对对象名称和属性类型应用 unique together 约束。

顺便说一句 - 这类似于 this post 但他们使用了一个我不确定我是否需要的??

谢谢!!

【问题讨论】:

    标签: mysql django-models django-orm


    【解决方案1】:

    如果有人真的在寻找这个答案......

    使用Abstract Base Class 我创建了以下应该可以工作的结构。当然,它不再完全代表图片,但确实解决了问题。

    PROP_VALUE_CHOICES = (("URL", "url"),
                          ("Boolean", "bool"),
                          ("String", "char"),
                          ("Person", "person"))
    
    class PropertyType(models.Model):
        name = models.CharField(max_length=32)
        value_type = models.CharField(max_length=32, choices=PROP_VALUE_CHOICES)
    
    class Property(models.Model):
        type = models.ForeignKey(PropertyType, unique=True, related_name="%(app_label)s_%(class)s_related")
        value = models.CharField(max_length=32)
    
        class Meta:
            abstract = True
    
    class ObjectAProperties(Property): pass
    
    class ObjectA(models.Model):
        properties = models.ManyToManyField(Property, through="ObjectAProperties")
    
    class ObjectBProperties(Property): pass
    
    class ObjectB(models.Model):
        properties = models.ManyToManyField(Property, through="ObjectBProperties")
    

    张贴以防我将来再次需要它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2012-08-08
      • 2018-07-11
      • 2018-06-29
      • 2019-03-04
      • 2015-08-19
      • 2016-03-16
      相关资源
      最近更新 更多