Проблема с получением объектов на основе отношения ManyToManyField

У меня есть модель Meal и Ingredient, Meal имеет отношение ManyToMany к Ingredient. Я пытаюсь получить объекты, которые соответствуют Ингредиентам models.py

class Meal(models.Model):
    name = models.CharField(max_length=250)
    description = models.TextField(blank=True, null=True)
    recipe = models.TextField()
    is_published = models.BooleanField(default=False)
    user = ForeignKey(User, verbose_name='User', on_delete= models.CASCADE)
    difficulty = ForeignKey('Difficulty', on_delete=models.PROTECT, null=True)
    ingridients = models.ManyToManyField('Ingridient')
    ico = models.CharField(max_length=500, blank=True, null=True)

class CategoryIngridients(models.Model):
    name = models.CharField(max_length=100, db_index=True)

    def __str__(self):
        return self.name

class Ingridient(models.Model):
    name = models.CharField(max_length=100, db_index=True)
    category = ForeignKey('CategoryIngridients', on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

serializers.py

class MealSerializer(serializers.ModelSerializer):
    category = serializers.StringRelatedField()
    difficulty = serializers.StringRelatedField()
    #ingridients = serializers.StringRelatedField()
    user = serializers.StringRelatedField()
    class Meta:
        model = Meal
        fields = "__all__"

class IngrigientSerializer(serializers.ModelSerializer):
    category = serializers.StringRelatedField()
    class Meta:
        model = Ingridient
        fields = "__all__"

views.py

class TestCraft(APIView):
    def post(self, request):
        ingridients_tmp = request.data['ingredients']
        ingrid = Ingridient.objects.filter(id__in=ingridients_tmp)
        print(ingrid)
        queryset = Meal.objects.filter(ingridients__in=ingrid)
        print(queryset)
        serializer = MealSerializer(queryset, many=True)
        return Response(serializer.data)

Если я размещу json:

{"ingredients":[1,2]}

Этот вид возвращается, но они повторяются:

[
    {
        "id": 1,
        "difficulty": "Medium",
        "user": "vleo",
        "name": "gfgd",
        "description": "",
        "recipe": "...",
        "is_published": true,
        "ico": "",
        "ingridients": [
            1,
            2,
            3,
            4,
            5,
            6
        ]
    },
    {
        "id": 5,
        "difficulty": "Easy",
        "user": "vleo",
        "name": "залупа",
        "description": "[eqyz",
        "recipe": "n.,sr",
        "is_published": false,
        "ico": "",
        "ingridients": [
            1,
            2
        ]
    },
    {
        "id": 1,
        "difficulty": "Medium",
        "user": "vleo",
        "name": "gfgd",
        "description": "",
        "recipe": "...",
        "is_published": true,
        "ico": "",
        "ingridients": [
            1,
            2,
            3,
            4,
            5,
            6
        ]
    },
    {
        "id": 5,
        "difficulty": "Easy",
        "user": "vleo",
        "name": "sdf",
        "description": "[eqyz",
        "recipe": "n.,sr",
        "is_published": false,
        "ico": "",
        "ingridients": [
            1,
            2
        ]
    }
]

Также вы можете посоветовать: Как мне сделать класс TestCraft(APIView), чтобы одним путем я мог использовать ингредиенты из json, а также получать блюда (queryset) с помощью axios?

В случае запроса с фильтром по полю "многие-ко-многим" записи могут повторяться в результатах. Просто измените на

queryset = Meal.objects.filter(ingridients__in=ingrid).distinct()
        

для удаления многократных записей с помощью .distinct()

Вернуться на верх