Создание условного отношения «многие ко многим» в Django - PullRequest
0 голосов
/ 06 января 2020

Это кажется простым, но я все еще не могу понять, как это реализовать.

Попытка создать условные отношения «многие ко многим» (не уверен, правильно ли это называется!) Между тремя моделями. :


Class Book(models.Model):
    book_name = models.CharField(max_length=50)


Class Article(models.Model):
    article_name = models.CharField(max_length=50)


Class Portfolio(models.Model):
    KINDS = [('B', 'Book'), ('A', 'Article')]
    book = models.ForeignKey(Book, on_delete=models.PROTECT)
    article = models.ForeignKey(Article, on_delete=models.PROTECT)
    kind = models.models.CharField(max_length=1, choices=KINDS)
    user = models.ManyToManyField(User, through='Recommendation')


Class Recommendation(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    portfolio = models.ForeignKey(Book, on_delete=models.PROTECT)
    date = models.DateTimeField()

Каждый пользователь (из пользовательского модуля Django) может иметь несколько рекомендаций портфеля ios. Каждое портфолио - это группа книг и статей, рекомендуемых на определенную дату c.

1 Ответ

2 голосов
/ 07 января 2020

Я бы пропустил модель портфеля и просто реализовал ее следующим образом:

class Book(models.Model):
    book_name = models.CharField(max_length=50)


class Article(models.Model):
    article_name = models.CharField(max_length=50)


class Recommendation(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    book = models.ForeignKey(
        Book,
        blank=True,
        null=True,
        on_delete=models.PROTECT
    )
    article = models.ForeignKey(
        Article,
        blank=True,
        null=True,
        on_delete=models.PROTECT
    )
    date = models.DateTimeField()

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=Q(book__isnull=True, article__isnull=False) | Q(book__isnull=False, article__isnull=True),
                name='only_book_or_article'
            )
        ]

вы можете пропустить ограничения, но чем вы рискуете, что ваши данные противоречивы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...