我们如何将DRF Serializerthodfield与Django-Filters Backend一起使用

发布于 2025-02-06 08:58:41 字数 5756 浏览 2 评论 0原文

获得错误喜欢这个。

我无法理解如何在这里创建逻辑,请创建一些逻辑(对我来说很有趣)。这是错误:

fielderror at/api/website/embly/ 无法将关键字“ IS_YOU”解析为字段。选择是:关于,地址,年龄,头像, 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, favourite_author, favourite_person, first_name, gender, groups, hair_color, height, hidden_​​author,hidden_​​person,id,收入,兴趣,is_active,is_online,is_online_show,is_Staff,is_superuser,语言,last_login,last_name,logentry,logentry,logentry,fooking,fooke,passwork,passwass,passwass,passwork,phone,电话,电话,电话,电话, 邮政,省,关系,宗教,skin_color,烟,运动,星,状态,更新,user_permissions,用户名,验证,重量

在这里是错误:

用户模型(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']

成员(serializers.py.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

成员视图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")

Getting an error likes this.

I am not able to understand that how to create a logic here please create some logic(for me it interesting). Here is the error:

FieldError at /api/website/member/
Cannot resolve keyword 'is_you' into field. Choices are: 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, favourite_author, favourite_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

Here is the error:

User model (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

Member 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]

Route (Urls.py)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

九八野马 2025-02-13 08:58:41

我认为您需要从filterset_fields列表中删除is_you

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']

I think you need to remove is_you from the filterset_fields list.

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']
何时共饮酒 2025-02-13 08:58:41

这是你想要的

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

Here's what you want

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文