【问题标题】:Common models in Django Rest FrameworkDjango Rest Framework 中的常用模型
【发布时间】:2021-12-23 17:56:54
【问题描述】:

我发现这篇非常有用的文章如何在 DRF 中使用常用模型。 Common Models in Django and the DRF

所以我想为数据库中的所有 by 对象创建一个 create_by、created_when、updated_by 和 updated_when 属性。我之前将 viewsets.ModelViewSet 与 mixins.ListModelMixin 和 mixins.CreateModelMixin 一起使用,并且可以正常工作。我刚刚用我的新 CommonViewSet 类替换了 viewsets.ModelViewSet。

这是我的代码:

views.py

class CommonViewSet(viewsets.ModelViewSet):
"""Ensure the models are updated with the requesting user."""

    def perform_create(self, serializer):
        """Ensure we have the authorized user for ownership."""
        serializer.save(created_by=self.request.user, updated_by=self.request.user)

    def perform_update(self, serializer):
        """Ensure we have the authorized user for ownership."""
        serializer.save(updated_by=self.request.user)


class TagViewSet(CommonViewSet,
             mixins.ListModelMixin,
             mixins.CreateModelMixin):
    """Manage tags in the database"""
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    queryset = Tag.objects.all()
    serializer_class = serializers.TagSerializer

序列化器.py

class CommonSerializer(serializers.ModelSerializer):
"""Ensure the fields are included in the models."""

common_fields = ['created_by', 'created_at', 'updated_by', 'updated_at']


class TagSerializer(CommonSerializer):
    """Serializer for tag objects"""

    class Meta:
        model = Tag
        fields = (['id', 'name'] + CommonSerializer.common_fields)
        read_only_fields = ('id',)

models.py

class CommonModel(models.Model):
"""Common fields that are shared among all models."""

created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name="+")
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name="+")
created_at = models.DateTimeField(auto_now_add=True,
                                  editable=False)
updated_at = models.DateTimeField(auto_now=True,
                                  editable=False)

class Tag(CommonModel):
"""Tag to be used for device type"""
name = models.CharField(max_length=255)

def __str__(self):
    return self.name

但现在我收到此错误消息:

类 TagViewSet(CommonViewSet, TypeError:无法创建一致的方法解析 基础 CreateModelMixin、ListModelMixin 的订单 (MRO)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    DRF ModelViewset的写法如下

    class ModelViewSet(mixins.CreateModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyModelMixin,
                       mixins.ListModelMixin,
                       GenericViewSet):
    

    所以在TagViewSet,你不需要再次导入mixins。 你可以这样写

    class TagViewSet(CommonViewSet):
        ...
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2018-07-13
      • 2014-06-10
      相关资源
      最近更新 更多