【问题标题】:field name choice 'reference' is not a valid choice issue字段名称选择“参考”不是有效的选择问题
【发布时间】:2019-05-14 07:00:40
【问题描述】:

我正在尝试创建一个视图集,我想在其中过滤所有具有相同参考号的记录。成员模型中有一个参考模型字段,但它告诉我它是一个无效字段。

这是视图集:

from groups.models import Member
from ..serializers import MemberSerializer
from rest_framework import viewsets

class MemberViewSet(viewsets.ModelViewSet):
    queryset = Member.objects.filter(field_name='reference')
    serializer_class = MemberSerializer

这是模型:

class Member(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    reference = models.CharField(max_length=22)
    balance = models.DecimalField(max_digits=12, decimal_places=2)
    open_tabs = models.IntegerField()
    created = models.DateTimeField(auto_now_add=True)

这是网址:

from groups.api.views.memberViews import MemberViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'', MemberViewSet, base_name='member')
urlpatterns = router.urls

所以我想过滤掉所有具有相同引用字段值的成员对象...

【问题讨论】:

  • 如果我理解正确,您希望您的视图集只有 Members 有一个独特的 reference 吗?
  • 是的,我希望它只显示具有唯一引用的成员,该引用被传递到 url @ElioMaisonneuve

标签: python django django-models django-rest-framework


【解决方案1】:

如果您希望 Members 在您的视图集中具有特定的 reference,则应覆盖 get_queryset 方法并将参数添加到 url。

在视图集中:

from groups.models import Member
from ..serializers import MemberSerializer
from rest_framework import viewsets

class MemberViewSet(viewsets.ModelViewSet):
    serializer_class = MemberSerializer
    def get_queryset(self):
        reference = self.kwargs['reference']
        return Member.objects.filter(reference=reference)

在网址中:

from groups.api.views.memberViews import MemberViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'(?P<reference>[-\w]+)', MemberViewSet, base_name='member')
urlpatterns = router.urls

the drf guide to filtering

【讨论】:

    【解决方案2】:

    参考QuerySet

    您可以尝试使用以下方法,其中'SearchKey' 是您要查询的参考号吗?

    queryset = Member.objects.filter(reference__contains='SearchKey')
    

    【讨论】:

    • 我试过了,但是没用queryset = Member.objects.filter(reference__contains='reference')
    • 您的数据库中是否存在字段reference 包含值“reference”的行?这就是当前查询集正在寻找的内容。您能否在参考字段中分享一些实际值,例如“REFID1234”?那么查询应该是:queryset = Member.objects.filter(reference__contains='REFID1234')
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多