Кверисет более функционально
У меня вопрос, является ли данный код приемлемым, или есть другая возможность с более оптимальным выходом из этой ситуации. Моя одна модель выглядит так:
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