Ограничение отношения django «многие ко многим» с использованием unique_together - PullRequest
0 голосов
/ 14 июля 2011

Я думаю, что это может быть больше SQL, чем Django, но Django - это то, над чем я работаю. Я пытаюсь создать объектную модель, которая может иметь много свойств, но ограничена только одним типом свойства наобъект.

Скажем, у нас есть 3 типа свойств:

  • is_cool
  • is_happy
  • is_mean

Предположим, у меня естьобъект (MyObject), к которому можно применить * (0-All) из этих свойств, но только по одному из каждого.

Так что я думаю, что это схематично выглядит следующим образом (пожалуйста, поправьте меня, если я ошибаюсь):

Object MySQL Diagram

В 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 на имя объекта и тип свойства.

Кстати - это похожена этот пост но они использовали через который я не уверен, что мне нужно ??

Спасибо !!

1 Ответ

0 голосов
/ 22 июля 2011

Если кто-то действительно ищет этот ответ ...

Использование Абстрактный базовый класс Я создал следующую структуру, которая должна работать.Конечно, это больше не представляет картину полностью, но действительно решает проблему.

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")

Опубликовано на тот случай, если мне понадобится это снова в будущем!

...