Джанго, имеющий один к одному и много ко многим отн. В одной модели - PullRequest
0 голосов
/ 01 октября 2019

Мы хотим, чтобы в одной и той же модели было много-много-много-однозначных отношений. Позвольте мне привести пример.

class Definition(models.Model):
    value = models.CharField(max_length=100)
    ...

class Container(models.Model):
    name = models.CharField(max_length=30)
    container_specific_defn = models.OneToOneField(Definition, null=True, blank=True)
    definitions = models.ManyToManyField(Definition)

Как вы можете видеть, модель Container имеет как 1to1, так и м2м отн. С моделью Definition. то есть. Я хочу, чтобы Container мог иметь любое количество определений, но определение, которое мы собираемся добавить в набор definitions, не следует добавлять в поле container_specific_defn любого контейнера.

Но приведенный выше дизайн модели позволяетdefn, который был назначен полю container_specific_defn одного контактера для добавления в набор definitions другого контейнера.

container_specific_defn = Definition.objects.create(value='container_specific')
global_defn = Definition.objects.create(value='global')

c1 = Container.objects.create(name='c1', container_specific_defn=container_specific_defn)
c2 = Container.objects.create(name='c2')
c2.definitions.add(container_specific_defn)
c2.save()
# [container_specific_defn]

Нужно ли менять дизайн модели?

1 Ответ

0 голосов
/ 01 октября 2019

Нет ничего абсолютно неправильного в дизайне вашей модели, но я бы, вероятно, смоделировал это по-другому: используя сквозную таблицу с "конкретным" полем.

class Container(models.Model):
    name = models.CharField(max_length=30)
    definitions = models.ManyToManyField(Definition, through="ContainerDefinition")

class ContainerDefinition(models.Model):
    container = models.ForeignKey(Container, on_delete=models.CASCADE)
    definition = models.ForeignKey(Definition, on_delete=models.CASCADE)
    specific = models.BooleanField(default=False)
...