Как переписать метод get_queryset для отображения только тех объектов, которые содержатся в поле многие ко многим в django? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть API, который имеет две модели. Buildings и BuildingGroup. Каждое здание входит в строительную группу.

Я хочу переписать метод get_queryset, чтобы отображались только здания, входящие в группу зданий.

Мои модели:

class Building(models.Model):
    name  = models.CharField(max_length=120, null=True, blank=True)

    def __str__(self):
        return self.name


class BuildingGroup(models.Model):
    description = models.CharField(max_length=500, null=True, 
    buildings = models.ManyToManyField('Building')

Мое мнение до сих пор:

class BuildingGroupAPIView(
                      mixins.RetrieveModelMixin,
                      ListAPIView):

    permission_classes          = [permissions.IsAdminUser]
    authentication_classes      = [SessionAuthentication]

    serializer_class = BuildingSerializer
    passed_id = None

    def get_queryset(self):
        qs = BuildingGroup.buildings.all()
        query = self.request.GET.get('q')
        if query is not None:
            qs = qs.filter(project__icontains=query)
        return qs

    def get_object(self):
        request = self.request
        passed_id = request.GET.get('id', None) or self.passed_id
        queryset = self.get_queryset()
        obj = None
        if passed_id is not None:
            obj = get_object_or_404(queryset, id=passed_id)
            self.check_object_permissions(request, obj)
        return obj

Мой сериализатор:

class BuildingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Building

        fields = (
                'name',
                'height'
                'width'
        )

это показывает мне список всех зданий. Теперь я хочу изменить этот метод, но пока не могу справиться.

Я пытался:

qs = BuildingGroup.objects.buildings.all()
qs = BuildingGroup.buildings.all()
qs = BuildingGroup.buildings_set.all()

и я попытался перебрать BuildingGroup ...

У кого-нибудь есть идея? Помощь, конечно, очень ценится. Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Мы можем использовать обратную связь для запроса.Пожалуйста, проверьте ниже код.Я не проверял это, но это должно работать.

def get_queryset(self):
    qs = Building.objects.all()
    query = self.request.GET.get('q')
    if query is not None:
        qs = qs.filter(buildinggroup_set__description__icontains=query)
    return qs
2 голосов
/ 11 июня 2019

Я надеюсь, что вам нужно отфильтровать с отношением m2m,

def get_queryset(self):
    <b>qs = Building.objects.all()</b>
    query = self.request.GET.get('q')
    if query is not None:
        qs = qs.<b>filter(name=query)</b>
    return qs
1 голос
/ 11 июня 2019

Сначала внесите небольшое изменение в поле Buildings в BuildingGroup модели, например, удалив кавычку, поэтому она вызывает модель Building

buildings = models.ManyToManyField(Building)

Итак, скажем, у вас есть две Building модели следующим образом,

building1 = Building.objects.get(id=1)
building2 = Building.objects.get(id=2)

и BuildingGroup модель, подобная этой,

building_group = BuildingGroup.objects.get(id=2)

Затем вы добавляете следующие зданий в BuildingGroup примерно так:

building_group.buildings.add(building1)
building_group.buildings.add(building2)

Чтобы получить список всех зданий, добавленных в BuildingGroup экземпляр, вы используете

building_group.buildings.all()

Дайте мне знать, как это происходит.Goodluck.

РЕДАКТИРОВАТЬ .Кажется, вы вызываете всю модель здесь:

qs = BuildingGroup.buildings.all()

вместо этого должен быть экземпляр BuildingGroup.

building_group = BuildingGroup.objects.get(id='id')
qs = building_group.buildings.all()
...