Джанго не понимает, пусто ли мое поле в базе данных - PullRequest
0 голосов
/ 29 апреля 2019

Итак, я работаю над API.Запрос GET, имеющий условие для генерации одного или другого поля рендеринга.Но, к моему удивлению, is None не работает для пустого поля.Как мне решить эту проблему?

Вот моя таблица, например :

--------------------------------------------------------------------------
| ms        | offer_id  | priprity_one  | priority_two  |  priority_three
--------------------------------------------------------------------------
| 89899     |           | priority_one  | priority_two  |  priority_three
| 32323     | 3021      | priority_one  | priority_two  |  priority_three
| 12321     | 3022      | priority_one  | priority_two  |  priority_three
| 43421     | 3023      | priority_one  | priority_two  |  priority_three

views.py

from mamo.models import Mamo
from rest_framework import generics
from mamo.serializers import MamoSerializer
from django.http import Http404
from IPython import embed


class OfferView(generics.ListAPIView):
    serializer_class = MamoSerializer
    lookup_field = 'ms'

    def get_queryset(self):
        msisdn = self.kwargs['ms']
        try:
            return Mamo.objects.filter(ms=ms)
        except Mamo.DoesNotExist:
            raise Http404

    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset()

        serializer = self.serializer_class(queryset, many=True)

        if serializer.data[0]['offer_id'] is not None:
            result = serializer.data[0]['priority_one']
        elif serializer.data[0]['offer_id'] is None: # This line dont work
            result = serializer.data[0]['priority_two']
        else:
            result = serializer.data[0]['priority_three']
        return Response(result)

models.py

class Basic(models.Model):
    ms = models.BigIntegerField(db_index=True, blank=False, help_text="Customer")
    offer_id = models.CharField(max_length=20, null=True, blank=True)
    priority_one = models.CharField(max_length=350, null=True, blank=True, default='cleaner')
    priority_two = models.CharField(max_length=350, null=True, blank=True, default='cleaner')
    priority_three = models.CharField(max_length=350, null=False, default='cleaner') 

    class Meta:
        #ordering = ('ms',)
        db_table = 'offer_table'

    def __str__(self):
        return self.ms

Чтобы это работало, это то, что я сделал ниже, но я считаю, что это не имеет смысла.Я предпочту любой другой способ.

    if len(serializer.data[0]['offer_id']) > 0:
        result = serializer.data[0]['eligible_offer']
    elif len(serializer.data[0]['offer_id']) == 0:
        result = serializer.data[0]['market_offer']
    else:
        result = serializer.data[0]['informational_offer'] 
    return Response(result)

Примечание. Я использую DRF.Я также позвонил is empty на ту часть, которая не работает, она все еще не работает. Значение, когда поле в базе данных пустое, как я показал в базе данных , elif serializer.data[0]['offer_id'] is None Условная часть должна вступить в силу, но не ответить .

Iиспользовал embed для отладки, и вот что я получаю:

n [11]: serializer.data[0]['offer_id']
Out[11]: u''

In [12]: serializer.data[0]['offer_id'] is None
Out[12]: False

In [13]:  serializer.data[0]['offer_id'] is empty
Out[13]: False

1 Ответ

1 голос
/ 29 апреля 2019

Это все очень запутано.

Ваша основная проблема состоит в том, что поле содержит пустую строку, а не значение NULL.Это не одно и то же.Если бы вы использовали Pythonic if serializer.data[0]['offer_id'] вместо явного сравнения с None, тогда это просто сработало бы.В любом случае, вы не должны разрешать null=True в CharFields.

Ваша большая проблема заключается в том, что вы полностью запутались в отношении различных компонентов в DRF.ListAPIView предназначен для возврата списка элементов, а его метод get связан с отображением этого списка.Список должен состоять из сериализованного набора запросов.По какой-то причине вы используете это для возврата одного поля одного элемента - первого в базе данных.Это не имеет никакого смысла.

Кроме того, сериализатор предназначен для возврата пользователю сериализованных данных.По какой-то причине вы не хотите этого делать, вы хотите вернуть одно поле.Следовательно, нет причины использовать здесь сериализатор.Вы должны просто проверить значение модели.Итак:

item = self.get_queryset().first()

if item.offer_id:
   result = item.priority_one
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...