Кверисет более функционально

У меня вопрос, является ли данный код приемлемым, или есть другая возможность с более оптимальным выходом из этой ситуации. Моя одна модель выглядит так:

class ModelA(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  manga = models.ManyToManyField(Manga, through='ModelB') 

  def manga_list(self):
    return ModelB.objects.filter(user=self.pk).all()

  def manga_list_reading(self):
    return ModelB.objects.filter(user=self.pk, type=utils.READING).all()

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

class ModelB(models.Model):
  user = models.ForeignKey(ModelA, on_delete=models.CASCADE, )
  manga = models.ForeignKey(Manga, on_delete=models.CASCADE)
  type = models.CharField(max_length=30, choices=utils.LIST_PROFILE_CHOICES, null=False, blank=False)

Итак, мой вопрос касается этого def list return, есть ли какой-то другой вариант для этого?

Ваш manga_list может быть запрошен с помощью:

self.modelb_set.all()  # ModelB objects

Таким образом, не имеет особого смысла указывать метод для этого, поскольку вы можете запросить его с помощью my_model_a.modelb_set.all(). Более того, именование этого метода manga_list немного "вводит в заблуждение", поскольку кверисет будет возвращать ModelB объекты, а не Manga объекты. Если вы хотите вернуть все Manga объекты, связанные с ModelB, вы можете сделать это с помощью:

my_model_a.manga.all()  # Manga objects

Если вы хотите получить Manga объекты, для которых тип является READING, вы можете получить их с помощью:

my_model_a.manga.filter(modelb__type=utils.READING)  # Manga objects
Вернуться на верх