Как мы можем использовать Drf SerializerMethodField с бэкендом django-filters

Получаем ошибку, подобную этой.

Я не могу понять, как создать логику, пожалуйста, создайте логику (для меня это интересно). Вот ошибка:

FieldError at /api/website/member/ Невозможно преобразовать ключевое слово 'is_you' в поле. Возможные варианты: about, address, age, avatar, blocked_author, blocked_person, blog, blogcategory, blogtag, bookmark_author, bookmark_person, children, city, country, created_at, date_joined, education, email, employement, ethnicity, eye_color, faq, favorite_author, favorite_person, first_name, gender, groups, hair_color, height, hidden_author, hidden_person, id, income, interests, is_active, is_online, is_online_show, is_staff, is_superuser, language, last_login, last_name, logentry, looking, password, phone, postal, province, relationship, religion, skin_color, smoke, sports, star, status, updated_at, user_permissions, username, verified, weight

.

Вот ошибка:

Модель пользователя (Models.py)

class User(AbstractUser):
    username = models.CharField('username', max_length=150, unique=True)
    email = models.EmailField('email address', unique=True, max_length=255)
    first_name = models.CharField(max_length=250, null=True, blank=True)
    last_name = models.CharField(max_length=250, null=True, blank=True)
    phone = models.CharField(max_length=15, null=True, blank=True)
    about = models.CharField(max_length=1000, null=True, blank=True)
    country = models.CharField(max_length=100, null=True, blank=True)
    province = models.CharField(max_length=100, null=True, blank=True)
    city = models.CharField(max_length=100, null=True, blank=True)
    postal = models.CharField(max_length=100, null=True, blank=True)
    address = models.CharField(max_length=500, null=True, blank=True)
    gender = models.CharField(max_length=500, null=True, blank=True)
    age = models.CharField(max_length=500, null=True, blank=True)
    is_online = models.BooleanField(null=True, blank=True)
    is_online_show = models.BooleanField(null=True, blank=True)
    looking = models.CharField(max_length=100, null=True, blank=True)
    employement = models.CharField(max_length=50, null=True, blank=True)
    education = models.CharField(max_length=500, null=True, blank=True)
    religion = models.CharField(max_length=50, null=True, blank=True)
    star = models.CharField(max_length=50, null=True, blank=True)
    smoke = models.CharField(max_length=500, null=True, blank=True)
    language = models.CharField(max_length=500, null=True, blank=True)
    ethnicity = models.CharField(max_length=500, null=True, blank=True)
    relationship = models.CharField(max_length=500, null=True, blank=True)
    height = models.CharField(max_length=500, null=True, blank=True)
    weight = models.CharField(max_length=500, null=True, blank=True)
    eye_color = models.CharField(max_length=500, null=True, blank=True)
    hair_color = models.CharField(max_length=500, null=True, blank=True)
    skin_color = models.CharField(max_length=500, null=True, blank=True)
    children = models.CharField(max_length=500, null=True, blank=True)
    income = models.CharField(max_length=500, null=True, blank=True)
    sports = models.CharField(max_length=500, null=True, blank=True)
    interests = models.CharField(max_length=500, null=True, blank=True)
    avatar = fields.ImageField(
        upload_to="avatars", blank=True, null=True, default="avatar.png")
    status = models.CharField(max_length=1, choices=statuses, default='1')
    verified = models.CharField(max_length=1, choices=(
        ('1', 'Yes'), ('0', 'No')), default='1')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

MemberSerializer (Serializers.py)

class MemberSerializer(serializers.ModelSerializer):
    bookmark = serializers.SerializerMethodField('get_bookmark')
    is_you = serializers.SerializerMethodField('get_you')

    class Meta:
        model = User
        fields = (
            'id', 'username', 'first_name', 'last_name', 'email', 'phone', 'about', 'country', 'province', 'city',
            'postal', 'address', 'status', 'verified', 'avatar', 'gender', 'age', 'is_online', 'is_online_show', 'looking', 'employement', 'education',
            'religion', 'star', 'smoke', 'language', 'ethnicity', 'relationship', 'height', 'weight', 'eye_color', 'hair_color',
            'skin_color', 'children', 'income', 'sports', 'interests', 'is_staff', 'is_superuser', 'is_active', 'created_at', 'updated_at',
            'bookmark','is_you')

    def get_bookmark(self, obj):
        LoginUser = self.context.get('request').user.id
        BookmarkUser = Bookmark.objects.filter(
            member_id=obj.id, created_by=LoginUser).first()
        try:
            return {'bookmark': True, 'id': BookmarkUser.id}
        except:
            return {'bookmark': False, 'id': None}

    def get_you(self, obj):
        user = self.context.get('request').user.id
        if user == obj.id:
            return True
        return False

Член viewsets.ReadOnlyModelViewSet (Views.py)

class MemberApi(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = MemberSerializer
    filter_class = MemberFilter
    filter_backends = [DjangoFilterBackend, OrderingFilter, SearchFilter]
    filterset_fields = ['id', 'username', 'first_name',
                        'last_name', 'email', 'phone','is_online','is_you']
    search_fields = ['id', 'username', 'first_name',
                        'last_name', 'email', 'phone','is_online']
    ordering = ['-id']
    pagination_class = pagination
    # authentication_classes = authclass
    # permission_classes = [IsAuthenticated]

Маршрут (Urls.py)

router.register("member", MemberApi, basename="WebsiteMemberApi")

Думаю, вам нужно удалить is_you из списка filterset_fields.

class MemberApi(viewsets.ReadOnlyModelViewSet):
    ...
    # here I removed is_you because it's just the attribute in the serializer
    filterset_fields = ['id', 'username', 'first_name', 'last_name', 'email', 'phone','is_online']

Вот что вам нужно

from django_filters import rest_framework as filters


class MemberFilter(filters.FilterSet):
  is_you = filters.CharField(method='get_is_you')
  # ... rest fields

  class Meta:
    model = Member
    fields = ('id', 'username') 

  def get_is_you(self, qs, name, value):
    if value == 'true':
      return qs.filter(id=self.request.user.id)
    return qs
Вернуться на верх