【问题标题】:How to change lookup field in Model.viewset to other unique parameter in Django Rest Framework?如何将 Model.viewset 中的查找字段更改为 Django Rest Framework 中的其他唯一参数?
【发布时间】:2020-08-10 15:04:58
【问题描述】:

我在 django rest 框架中使用 Modelviewset。我想将查找字段更改为电子邮件(唯一)而不是 id。我试过添加 lookup_field = 'email' 在我的 Schema 视图集中,但它不起作用。这就是我得到的 { "detail": "Not found." } 我该如何解决这个问题。

我的 Views.py:

class SchemaViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):

    queryset = models.Schema.objects.all()
    serializer_class = serializers.SchemaSerializer
    lookup_field = 'email'

我的模型.py:

class Schema(models.Model):
    """Database model for Schema """

    name= models.TextField()
    version = models.TextField()
    email = models.EmailField(unique = True )


    def __str__(self):
        return self.email

我的序列化程序.py:

class SchemaSerializer(serializers.ModelSerializer):
    """Serializes Schema"""

    class Meta:
        model = models.Schema
        fields = (  'id', 'name', 'version', 'email')

【问题讨论】:

  • 对我来说一切都很好,您是否尝试过仅继承 viewsets.ModelViewSet 而不是 mixins?也许是这样?
  • 是的,我试过了。它也不起作用。无论如何,viewsets.ModelViewSet 和 mixins 是相似的,只是我不想放置、修补和删除,这就是为什么要使用 mixins

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


【解决方案1】:

更新您的代码如下:

class SchemaSerializer(serializers.ModelSerializer):
"""Serializes Schema"""

class Meta:
    model = models.Schema
    fields = ("id", "email")
    lookup_field = "email"


class SchemaViewSet(viewsets.ModelViewSet):
    queryset = models.Schema.objects.all()
    serializer_class = serializers.SchemaSerializer
    lookup_field = "email"
    lookup_value_regex = "[^/]+"  

【讨论】:

  • 还是 {"detail":"Not found."}
  • @yatharthmeena 我已经更新了答案,它对我有用。它也应该适合你
  • 我已经在我的问题中添加了图片。用您的答案更新代码后,我仍然得到相同的响应
  • @yatharthmeena 我的错,我正在检查字符串字段,电子邮件中包含一个 .,它没有被默认正则表达式解析,导致路由匹配失败。请试试这个
  • 这个正则表达式将通过所有内容。你可以在这里查看regex101.com
【解决方案2】:

当我没有在序列化程序的 Meta 类中设置 lookup_field 时,它甚至可以工作。

所以尝试只在视图集中设置lookup_field。这可能就足够了。

【讨论】:

    【解决方案3】:

    对我来说,我只需要更新ViewSet。无需更新Serializer

    class SchemaViewSet(viewsets.ModelViewSet):
        queryset = models.Schema.objects.all()
        serializer_class = serializers.SchemaSerializer
        lookup_field = "email"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2020-08-14
      相关资源
      最近更新 更多