Django rest framework группа по

Я хочу сгруппировать данные на основе ingredient_id, чтобы они не повторялись в ответе, как вы видите, я делаю запрос на основе ingredient_id, который является внешним ключом, поэтому он может повторяться в базе данных. Но я хочу, чтобы все данные об ингредиентах были только один раз, а затем информация о цепочке поставок вокруг них.

model.py

class SupplyChainStops(models.Model):
    ingredient = models.ForeignKey(Ingredients, null=True, on_delete=models.CASCADE)
    stop_name = models.CharField(max_length=1024, null=True, blank=True)
    stop_longitude = models.CharField(max_length=500, null=True, blank=True)
    stop_latitude = models.CharField(max_length=500, null=True, blank=True)

    def __str__(self):
        return f'{self.stop_name}'

query

@api_view(['GET'])
def supply_chain_response_detail(request, id):
    ingredient_detail = SupplyChainStops.objects.filter(ingredient_id=id).all()
    serializer = SupplyChainStopsSerializer(ingredient_detail, many=True)
    return Response(serializer.data)

Serializer

class IngredientSerializer(serializers.ModelSerializer):
    ingredient_category = IngredientCategorySerializer()
    supplier = SuppliersSerializer()
    origin = OriginSerializer()
    allergies = AllergiesSerializer(many=True)

    class Meta:
        model = Ingredients
        fields = '__all__'


class SupplyChainStopsSerializer(serializers.ModelSerializer):
    ingredient = IngredientSerializer(many=False)

    class Meta:
        model = SupplyChainStops
        fields = '__all__'

Вы можете сделать отчетливый запрос с позиционным аргументом. Вот новая версия вашего представления.

@api_view(['GET'])
def supply_chain_response_detail(request, id):
    ingredient_detail = SupplyChainStops.objects.filter(ingredient_id=id).distinct(
                                               "ingredient_id")
    serializer = SupplyChainStopsSerializer(ingredient_detail, many=True)
    return Response(serializer.data)

NOTE: Позиционный аргумент поддерживается только в PostgreSQL

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