Django Rest Framework 中的常用模型
Common models in Django Rest Framework
我发现这篇关于如何在 DRF 中使用通用模型的文章非常有用。
Common Models in Django and the DRF
所以我想为数据库中的所有对象设置 create_by、created_when、updated_by 和 updated_when 属性。我之前将 viewsets.ModelViewSet 与 mixins.ListModelMixin 和 mixins.CreateModelMixin 一起使用并且有效。我刚刚用新的 CommonViewSet class.
替换了 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
serializers.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
但现在我收到此错误消息:
class TagViewSet(CommonViewSet,
TypeError: Cannot create a consistent method resolution
order (MRO) for bases CreateModelMixin, ListModelMixin
DRF ModelViewseT写法如下
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
所以在TagViewSet
中,你不需要再次导入mixins。
你可以这样写
class TagViewSet(CommonViewSet):
...
我发现这篇关于如何在 DRF 中使用通用模型的文章非常有用。 Common Models in Django and the DRF
所以我想为数据库中的所有对象设置 create_by、created_when、updated_by 和 updated_when 属性。我之前将 viewsets.ModelViewSet 与 mixins.ListModelMixin 和 mixins.CreateModelMixin 一起使用并且有效。我刚刚用新的 CommonViewSet class.
替换了 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
serializers.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
但现在我收到此错误消息:
class TagViewSet(CommonViewSet, TypeError: Cannot create a consistent method resolution order (MRO) for bases CreateModelMixin, ListModelMixin
DRF ModelViewseT写法如下
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
所以在TagViewSet
中,你不需要再次导入mixins。
你可以这样写
class TagViewSet(CommonViewSet):
...