我有一个SQLAlchemy的模型.以下是我的models.py:

class PlaceInfoModel(Base):
    __tablename__ = 'place_info'

    id = Column(Integer, primary_key=True, autoincrement=True)
    owner_id = Column(Integer,nullable=False)  
    name = Column(String(60))
    address = Column(String(300))
    rating = Column(Float)
    type = Column(String(20))
    image = Column(String)

serializer.py:

from .models import PlaceInfoModel, sessionmaker,engine
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.fields import CurrentUserDefault


class PlaceInfoSerializer(serializers.Serializer):
    name = serializers.CharField()
    address = serializers.CharField()
    rating = serializers.FloatField()
    image = serializers.CharField(required=False)
    owner_id = serializers.IntegerField() # i want to auto update it with auth_user.id on POST request
    
    
        

这是我的views.py分:

class PlaceViewSet(ViewSet):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticatedOrReadOnly, IsPermittedForAction]
    ordering_fields = ['id', 'name', 'rating', 'address']

    
    def create(self, request):
        serializer = PlaceInfoSerializer(data=request.data)
        print(request.user.id)
        if serializer.is_valid():
            Session = sessionmaker(bind=engine)
            session = Session()
            place = PlaceInfoModel(**serializer.validated_data)
            session.add(place)
            session.commit()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我想通过SimpleJWT身份验证以某种方式将我的Owner_id填充到serializers.py.我try 使用CurrentUserDefault()执行此操作,但失败了.

推荐答案

您可以将owner_id设置为只读:

class PlaceInfoSerializer(serializers.Serializer):
    name = serializers.CharField()
    address = serializers.CharField()
    rating = serializers.FloatField()
    image = serializers.CharField(required=False)
    owner_id = serializers.IntegerField(read_only=True)

然后在串行化器中手动传递:

class PlaceViewSet(ViewSet):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticatedOrReadOnly, IsPermittedForAction]
    ordering_fields = ['id', 'name', 'rating', 'address']

    def create(self, request):
        serializer = PlaceInfoSerializer(data=request.data)
        print(request.user.id)
        if serializer.is_valid():
            Session = sessionmaker(bind=engine)
            session = Session()
            place = PlaceInfoModel(
                **serializer.validated_data, onwer_id=request.user.id
            )
            session.add(place)
            session.commit()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

话虽如此,我真的不明白为什么你使用Django如果你不使用ORM或模型.Django主要以模型为中心:它可以定义序列化器、表单等,所有这些都基于模型.因此,如果没有模型,它就会依赖于实现大量样板代码,这使得Django并不理想.

Django相关问答推荐

如何根据属性的 Select 对查询集进行排序

Django 5.0.2:TypeError:获取切片后无法过滤查询

Django 关系嵌套related_name

如何将数据(具体归档)从views.py 传递到models.py

Django 模型:如何查找自动生成的字段列表

Django 从 url 保存图像并与 ImageField 连接

Django Blob 模型字段

如何在不使用 sudo 的情况下安装 virtualenv?

用于测试文件下载的 Django 单元测试

Django error:不能分配必须是实例

无法通过 pip 安装 Django 2.0

如何在终端中切换 Python 版本?

Django admin:我可以定义字段顺序吗?

超过 1 个外键

Matplotlib - Tcl_AsyncDelete:异步处理程序被错误的线程删除?

django post_save 更新信号

django python 日期时间设置为午夜

Django REST Framework - 序列化可选字段

ModelForm 上的 Django 和字段集

Django:如何从模板中识别调用视图?