Django - как фильтровать модель по полю внешнего ключа?
У меня есть две модели для категорий, список категорий для всех пользователей (каждая уникальна) и список связей между пользователем и категорией.
# category/models.py
class CategoryList(models.Model):
name = models.TextField(unique=True, max_length=60, verbose_name='Category name')
def __str__(self):
return f'{self.name}'
class UserCategories(models.Model):
category = models.ForeignKey(CategoryList, on_delete=models.deletion.CASCADE, verbose_name='User's categories')
user = models.ForeignKey(User, on_delete=models.deletion.CASCADE, verbose_name='User')
def __str__(self):
return f'{self.category.name}'
Также у меня есть транзакции
# transactions/models.py
class Transaction(models.Model):
user = models.ForeignKey(User, on_delete=models.deletion.CASCADE, verbose_name='Transaction from')
payment_amount = models.DecimalField(default=0, decimal_places=2, max_digits=20, verbose_name='Payment amount')
date = models.DateField(auto_now=True, verbose_name='Date')
time = models.TimeField(auto_now=True, verbose_name='Time')
category = models.ForeignKey(UserCategories, null=True, on_delete=models.deletion.SET_NULL, verbose_name='Category')
organization = models.TextField(max_length=60, verbose_name='Organization')
description = models.TextField(max_length=300, null=True, blank=True, verbose_name='Transaction discription')
У меня есть следующий выпуск:
Я использую DRF для выполнения CRUD операций с транзакциями, и когда я пытаюсь добавить транзакцию (она выбирает текущего авторизованного пользователя) или обновить ее, я получаю все категории в поле
category = models. ForeignKey(UserCategories...)
и это не то, что мне нужно. Насколько я могу судить, выбор модели на иностранном языке аналогичен выбору модели на английском.ForeignKey (UserCategories.objects.all()
), но это не то, что мне нужно... Мне нужно что-то вроде фильтрации; при создании или обновлении транзакций, он должен показывать мне только список категорий для моего текущего пользователя, а не все! Мне нужен конечный результат типа "category = models."
ForeignKey(UserCategories.objects.filter(user=user))
, но я не уверен (и не нашел ответа в документации), как отфильтровать только категории для моего текущего пользователя.
Djoser также используется для регистрации и аутентификации пользователей. Это является обязательным. Я пытался добавить поле ManyToMany для моего пользовательского пользователя, но чтобы выбор категории работал, мне нужно добавить специальный сериализатор и добавить его в базовую функцию "user_create", как category = CategorySerializer(many=True)
, но я не могу. Djoser находится в моем venv, и это не лучшее решение - вносить изменения в чужую lib.
В принципе, в Django при фильтрации с внешним ключом вам нужно передать полный объект связанной модели, который вы можете передать в views.py следующим образом...
get_category = CategoryList.objects.get(id=id)
UserCategories.objects.filter(category=get_category)
# ------------------- OR ------------------
get_category = CategoryList.objects.get(id=id)
UserCategories.objects.filter(category__id=get_category.id)