Предельные параметры Django ManytoManyField - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть приложение, которое имеет 3 модели: подкасты, эпизоды и категории.

В категориях есть ForeignKey для подкаста:

class Category(models.Model):
    ...
    podcast = models.ForeignKey(Podcast, on_delete=models.CASCADE)
    ...

Итак, подкаст может иметь несколько связанные категории.

Каждый эпизод может быть связан с категорией подкаста. Я добавил это как ManyToManyField:

class Episode(models.Model):

    podcast = models.ForeignKey(Podcast, on_delete=models.CASCADE)
    categories = models.ManyToManyField(Category)
    ...

Проблема заключается в том, что в admin и modelforms поле категорий показывает список каждой категории для каждого подкаста, а не только те, которые связаны с этим подкастом. .

Как я могу использовать limit_choices_to, чтобы ограничивать категории только внешним ключом того же подкаста, с которым связан эпизод? Я пробовал следующее, но, очевидно, не работает, потому что «я» не определено.

categories = models.ManyToManyField(Category, limit_choices_to={'podcast': self.podcast})

Я хотел бы сделать это на уровне модели, если это возможно, поэтому мне не нужно добавлять дополнительные logi c вокруг остальной части приложения.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 08 февраля 2020

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

class Category(models.Model):
    title = models.CharField(max_length=120)


class Episode(models.Model):
    title = models.CharField(max_length=120)
    categories = models.ManyToManyField(Category, through='Podcast')


class Podcast(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    episode = models.ForeignKey(Episode, on_delete=models.CASCADE)
    title = models.CharField(max_length=120)

https://docs.djangoproject.com/en/3.0/topics/db/models/#extra поля-на-многих-на-многих

...