Отношение «многие ко многим» и «многие к одному» - PullRequest
0 голосов
/ 08 марта 2011

Я был бы очень признателен, если бы кто-нибудь смог проверить отношения «многие ко многим» и «многие к одному» в моем коде:

Проект:

1- Существуют разные «категории» (например: «мировые новости», «европа», «бизнес», «спорт»);эти "категории" будут предопределены и должны многократно меняться (добавить новую / удалить запись)

2- "новости" связаны с одной "категорией".

3- "Пользователь"может зарегистрировать столько" категорий ", сколько он хочет (цель состоит в том, чтобы создать сайт, который отображает" новости ", которые попадают в категорию" категории ", в которую входит" пользователь ".

4- Пользователь имеетвозможность удалить новости из его «ленты новостей». Когда это происходит, логическое поле «отброшено» устанавливается в значение «Истина» (см. класс «новости»).

class Category(models.Model):
    category = models.CharField(max_length=50)

class News(models.Model):
    question = models.CharField(max_length=100)
    pub_date = models.DateTimeField()
    discarded = models.BooleanField()
    category = models.ForeignKey(Category)

class User(models.Model):
    name = models.CharField(max_length=50)
    subscribed_category = models.ManyToManyField(Category)

Вопрос:

Я был бы очень признателен, если бы вы убедились, что поля foreignKey и manytomany правильно реализованы в коде. Любое улучшение будет приветствоваться:)

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Нет, это не совсем верно. Проблема в атрибуте discarded. Если я правильно понимаю, объект News - это элемент в определенной категории, поэтому он не имеет отношения к конкретному пользователю. Если вы установите discarded для объекта Новости, он будет установлен для всех пользователей.

Однако не совсем очевидно, как это смоделировать, поскольку между пользователем и новостями нет (правильно) никакой связи. Вам понадобится что-то вроде дополнительного ManyToMany между этими двумя столами для хранения отброшенных предметов:

class User(models.Model):
    ...
    discarded_items = models.ManyToManyField('News')

Таким образом, чтобы получить текущий список новостей для каждого пользователя, вам нужно просто проверить, что этот элемент отсутствует в user.discarded_items.

0 голосов
/ 08 марта 2011

То, что вы написали, прекрасно, и это будет работать. Однако лучший способ сделать это - определить нашу модель, например (в вашем случае):

class UsersInCategories(models.Model):
    user = models.ForeignKey(User)
    category = models.ForeignKey(Category)

Причина в том, что вы, возможно, захотите добавить некоторые дополнительные данные позже, например, дату подписки или что-то еще. Обратите внимание, что когда вы используете ManyToManyField, тогда django делает это за сценой (в вашей базе данных должна появиться дополнительная таблица с такой структурой, хотя я еще не тестировал ее). Так что если вам не нужны дополнительные данные, тогда все в порядке.

...