Как получить фильтр в сериализаторах в REST Framework? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть две таблицы, у них один и тот же столбец "maid", и у некоторых (вместо всех) код единицы горничной - "U", у них есть единицы измерения в таблице dep.Я хочу получить единицы, когда девайс адреса существует в dep.Результат, который я хочу, выглядит следующим образом:

   [ {
        "addline": "14075 110A Ave",
        "city": "Surrey",
        "unitcode": "U",
        "maid": 113091
    },
    {
        "addline": "14143 110A Ave",
        "city": "Surrey",
        "unitcode": "S",
        "maid": 113104,
        "unit": [ "A-101", "A-102", "A-103", "A-104"]
    }
  ]

Мой файл views.py такой, как показано ниже:

def list(self, request, city):
    if city is not None:
        queryset = address.objects.filter(city__icontains=city)
    serializer = ResultSerializer(queryset, many=True)
    return Response(serializer.data)

Мои модели такие, как показано ниже:

class address(models.Model):
    maid = models.IntegerField(primary_key=True, unique=True)
    fulladdress = models.CharField(max_length=120)
    city = models.CharField(max_length=120)
    unitcode = models.CharField(max_length=120)

class dep(models.Model):
    maid = models.IntegerField()
    Unit = models.CharField(max_length=120)

Имой serializers.py такой, как показано ниже:

class DepSerializer(serializers.ModelSerializer):
    class Meta:
        model = dep
        fields = ('Unit', )

class ResultSerializer(serializers.ModelSerializer):
    units = serializers.SerializerMethodField('get_unit')
    def get_unit(self, queryset):
        queryset_unit = dep.objects.filter(maid=queryset.maid)
        serializer = DepSerializer(instance=queryset_unit, many=True)
        return serializer.data

    class Meta:
        model = address
        fields = ('fulladdress', 'city', 'unitcode', 'units')

Кажется, все в порядке, но ответ сервера составляет 500. Я был поражен этой проблемой почти весь день, кто-нибудь может спасти меня?

Обновление:

После закрытия кнопки отладки я обнаружил реальную проблему:

LINE 1: ..."Unit" FROM "Company_dep" WHERE "Company_dep"."maid" = 73643
                                                                ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Как мне кажется, проблема в этом коде:

queryset_unit = dep.objects.filter(maid=queryset.maid)

Потому чтонекоторые из горничных не имеют модуля, как может пройти, когда горничная не существует в dep?

update2:

После открытой отладки, наконец, я нашел проблему, причина почемучто в моем PostgreSql maid - это varchar, а в models.py я установил его как IntegerField.

Просто измените этот код:

maid = models.CharField(max_length=120)

1 Ответ

0 голосов
/ 26 июня 2018

Возникает исключение Http 500 (Внутренняя ошибка сервера), поскольку вы можете определить DEBUG = False в вашем settings.py.Вы можете увидеть исходное исключение и трассировку, если вы установите его в DEBUG = True в settings.py файле

Ваш сериализатор выглядит нормально, но views нет.Поэтому измените свои взгляды, как показано ниже

<code>
def list(self, request, <b>city=None</b>):
    <b>queryset= address.objects.all()</b>
    if city is not None:
        <b>queryset = queryset.filter(city__icontains=city)</b>
    serializer = ResultSerializer(queryset, many=True)
    return Response(serializer.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...