Общие модели в Django Rest Framework

Я нашел эту очень полезную статью о том, как использовать общие модели в DRF. Общие модели в Django и DRF

Итак, я хотел иметь атрибуты create_by, created_when, updated_by и updated_when для всех объектов by в базе данных. Раньше я использовал viewsets.ModelViewSet вместе с mixins.ListModelMixin и mixins.CreateModelMixin, и это работало. Я просто заменил viewsets.ModelViewSet на мой новый класс CommonViewSet.

Вот мой код:

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: Невозможно создать последовательный порядок разрешения методов порядок (MRO) для баз CreateModelMixin, ListModelMixin

.

Запись DRF ModelViewseT выглядит следующим образом

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

Так что в TagViewSet вам не нужно снова импортировать миксины. Вы можете написать это следующим образом

class TagViewSet(CommonViewSet):
    ...
Вернуться на верх