Как применить фильтр к полю сериализатора rest-framework Django? - PullRequest
0 голосов
/ 22 января 2019

Скажем, у меня есть три модели, подобные этим:

class Message(models.Model):
    text = models.TextField()
    img = models.ForeignKey('Image')


class Image(models.Model):
    deleted = models.BooleanField()
    url = models.URLField()
    msg = models.ForeignKey('Message')

class Tag(models.Model):
    deleted = models.BooleanField()
    name = models.CharField(max_length=10)
    msg = models.ForeignKey('Message')

При сериализации Message мне нужно, чтобы tag s и url s не были удалены, что означает, что поле deleted равно False. Я надеюсь, что настроенный SlugField должен работать так:

class ValidSlugField(serializers.SlugRelatedField):
    def __init__(self, *args, **kwargs):
        super(ValidSlugField, self).__init__(*args, **kwargs)

    def get_queryset(self):
        return super(ValidSlugField, self).get_queryset().filter(deleted=False)

Но get_queryset выдал ошибку. Можно ли создать «общее проверенное» поле, подобное этому?

1 Ответ

0 голосов
/ 22 января 2019

Я не понимаю, почему вы создали 3 модели для него, может быть, вы можете сделать что-то вроде этого, если вам подходит.

  1. Создание только одной модели, включающей все поля.
  2. Создание настраиваемого сериализатора:

    class MessageSerializer(serializers.Serializer):
        #all fields are here
    
  3. С помощью этой ссылки вы можете проверить сообщение. https://www.django -rest-framework.org / апи-гид / сериализаторов / # проверка

    class MessageSerializer(serializers.Serializer):
        #all fields are here
        def validate(self,data):
            deleted = data.get('deleted')
            text = data.get('text')    
            img = data.get('img')
            if : #the shape of text or img for deleted is false
                 data['deleted'] = false 
                 return data
            return data #the shape of text or img for deleted is true
        def save(self):
              #use validated_data here
    
  4. После того, как вы можете использовать метод save() для использования проверенных данных, таких как
    deleted = self.validated_data['deleted']

...