#django #django-rest-framework
#django #django-rest-framework
Вопрос:
Я использую ModelSerializer для возврата сериализованных данных модели:
class CategorySerializer(serializers.ModelSerializer):
category_count = serializers.SerializerMethodField('_category_count')
def _category_count(self, obj):
category_obj = Category.objects.get(id=obj.id)
questions_count = Question.objects.filter(category=category_obj).count()
return questions_count
class Meta:
model = Category
fields = ["id", "category", "category_count"]
То, что я получаю сейчас, находится здесь:
[{
"category": "orzecznictwo lekarskie",
"category_count": 0,
"id": 9
},
{
"category": "zdrowie publiczne",
"category_count": 1,
"id": 10
}
]
Я хочу удалить объекты с category_count == 0 из сериализации
[
{
"category": "zdrowie publiczne",
"category_count": 1,
"id": 10
}
]
Спасибо за вашу помощь.
Редактировать:
class Question(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
question = models.TextField(blank=True, null=True)
(...)
class Category(models.Model):
category = models.TextField()
category_slug = models.CharField(max_length=50)
Комментарии:
1. покажите нам модели LepAppPytanie и LepAppDzial
2. Пожалуйста, переведите названия полей и моделей на английский, это очень трудно читать для тех, кто не знает румынский.
3. @Melv Я перевел поля на английский
4. @iklinac Я добавил модели LepAppPytanie (Вопрос) и LepAppDzial (категория)
Ответ №1:
Вы генерируете поле внутри сериализатора, а затем хотите удалить объект. Это не так, как все работает: сериализаторы просто меняют представление данных. Какие данные отображаются, определяется в представлениях.
class CategoryListView(generics.ListAPIView):
def get_queryset(self):
return models.Category.objects.annotate(
question_count=Count("question_set")
).exclude(question_count=0)
И в сериализаторе вам больше не нужно создавать счетчик и добавлять ‘question_count’ Meta.fields
.
Редактировать:
Забыл, что DRF проверит поле в модели и завершится ошибкой, поэтому вам нужно объявить поле:
class CategoryWithQuestionCount(serializers.ModelSerializer):
question_count = serializers.IntegerField(read_only=True)
class Meta:
model = models.Category
fields = ("pk", "category", "question_count")
Ответ №2:
Я не уверен, стоит ли удалять его в ModelSerializer. Но вы можете попробовать переопределить get_queryset() или изменить набор запросов в вашем представлении:
queryset = Class.objects.exclude(dzial_liczba_pytan=0)
Комментарии:
1. Это не сработает, потому что это сгенерированное поле сериализатора, а не поле модели.
2. @Melvyn Данные, которые он получит, будут из набора представлений нет? тогда не проще ли просто исключить данные из набора представлений?
3. Вы можете включать записи только в представление, а не в сериализатор, но опять же — dzial_liczba_pytan не является полем модели, поэтому вы не можете фильтровать по нему.
4. о, да, это правда, моя ошибка.