Как django создает внутренние таблицы динамически для полей «многие ко многим» - PullRequest
0 голосов
/ 13 марта 2019

Моя модель:

class Image(models.Model):
    name=models.CharField(max_length=40,unique=True,help_text="name of the image")
    tags = models.ManyToManyField(Tag)
class Tag(models.Model):
    tag = models.CharField(max_length=100,unique=True)

здесь, когда я делаю миграции и миграцию, она создает 3 таблицы в моей базе данных 1.image 2.tag 3.image_tags table

Итак, мой вопрося не определяю таблицу image_tags в моем файле models.py, откуда django создает таблицу image_tags и каков поток ??Я проверил файл миграции, но не получил ясности относительно этого

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

На самом деле, это не функциональность Джанго.Это функциональность SQL.SQL создает внутреннюю таблицу.Поскольку SQL не может создать ссылку, это не внешний ключ.Вот почему возникла эта концепция Bridging Table.Это решит проблему, а также будет содержать данные (ID) обеих таблиц и нескольких пользовательских полей, в зависимости от требований.

Обновлено с новым требованием: См. Это:

https://gist.github.com/jacobian/827937

Django 1.8 - посреднические отношения «многие ко многим через» - каковы последствия использования «ManytoManyField»?

С моей точки зрения, этоНе рекомендуется настраивать таблицу мостов.Вы можете указать дополнительные поля для любой из двух таблиц или создать новую таблицу как внешний ключ

0 голосов
/ 13 марта 2019

Промежуточная таблица требуется для отношения «многие ко многим» в базе данных, и поскольку большую часть времени вам не нужно хранить дополнительные данные об отношениях, Django просто создает эту таблицу для вас.В вашем случае он создаст таблицу с 3 полями: id, image_id, tag_id.

Если вы хотите указать свою собственную таблицу-посредник, например, если вы хотите сохранить дополнительные данные, вы можете создать модель с ForeignKey для связанных таблиц, а затем определить свой ManyToManyField с аргументом "through", например, так:

class ImageTag(models.Model):
  image = models.ForeignKey('Image')
  tag = models.ForeignKey('Tag')
  extra_data = models.CharField()

class Tag(models.Model):
  name = models.CharField()

class Image(models.Model):
  name = models.CharField()
  tags = models.ManyToManyField(Tag, through=ImageTag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...