【问题标题】:How to update and create at the same time using nested serializers and viewsets in DRf?如何使用 DRf 中的嵌套序列化程序和视图集同时更新和创建?
【发布时间】:2021-05-25 08:01:03
【问题描述】:

我的模型:

class User(AbstractUser):
    password = models.CharField(max_length=128, blank=True, null=True)
    email = models.EmailField(max_length=254, unique=True)
    dial_code_id = models.CharField(max_length=100)
    mobile_number = models.CharField(max_length=100, unique=True)
    username = models.CharField(max_length=150, unique=True, blank=True, null=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        db_table = "my_user"


class UserLocation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='location')
    latitude = models.DecimalField(max_digits=8, decimal_places=3)
    longitude = models.DecimalField(max_digits=8, decimal_places=3)
    address = models.TextField()

    class Meta:
        db_table = "user_location"

我必须更新'first_name'、'last_name',同时我必须在'UserLocation'表中为同一个用户创建一个对象。 为此,我创建了一个视图集

class BasicInformationViewSet(viewsets.ModelViewSet):
  queryset = User.objects.all()
  serializer_class = BasicInformationSerializer

  def list(self, request, *args, **kwargs):
      custom_data = {
          "status": False,
          "message": 'Method Not Allowed',
      }
      return Response(custom_data, status=status.HTTP_200_OK)

  def create(self, request, *args, **kwargs):
      custom_data = {
          "status": False,
          "message": 'Method Not Allowed',
      }
      return Response(custom_data, status=status.HTTP_200_OK)

  def update(self, request, *args, **kwargs):
      instance = self.get_object()
      serializer = self.get_serializer(instance, data=request.data)
      if serializer.is_valid():
          serializer.save()
          custom_data = {
              "status": True,
              "message": 'Successfully added your basic information',
          }
          return Response(custom_data, status=status.HTTP_200_OK)
      else:
          custom_data = {
              "status": False,
              "message": serializer.errors,
          }
          return Response(custom_data, status=status.HTTP_200_OK)

上述视图的序列化器:

class UserLocationSerializer(serializers.ModelSerializer):
  latitude = serializers.DecimalField(max_digits=8, decimal_places=3, required=True)
  longitude = serializers.DecimalField(max_digits=8, decimal_places=3, required=True)
  address = serializers.CharField(required=True)

  class Meta:
      model = UserLocation
      fields = "__all__"


class BasicInformationSerializer(serializers.ModelSerializer):
  first_name = serializers.CharField(required=True)
  last_name = serializers.CharField(required=True)
  location = UserLocationSerializer()

  class Meta:
      model = User
      fields = ['first_name', 'last_name', 'location']

  def update(self, instance, validated_data):
      instance.first_name = validated_data.get('first_name', instance.first_name)
      instance.last_name = validated_data.get('last_name', instance.last_name)
      instance.save()
      return instance

“first_name”和“last_name”正在更新,但“UserLocation”模型中的字段未更新/创建。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    modelViewSet jas 属性 http_method_name 表示允许访问此类的 http 方法,因此您的代码如下:

    
    
    class BasicInformationViewSet(viewsets.ModelViewSet):
      queryset = User.objects.all()
      serializer_class = BasicInformationSerializer
      http_method_names = ['put']
    
    
      def update(self, request, *args, **kwargs):
          instance = self.get_object()
          serializer = self.get_serializer(instance, data=request.data)
          if serializer.is_valid():
              serializer.save()
              custom_data = {
                  "status": True,
                  "message": 'Successfully added your basic information',
              }
              return Response(custom_data, status=status.HTTP_200_OK)
          else:
              custom_data = {
                  "status": False,
                  "message": serializer.errors,
              }
              return Response(custom_data, status=status.HTTP_200_OK)
    

    在您编写的这段代码中,我没有看到任何创建 UserLocation 的代码块。但是,如果您有一个获取 UserLocation 属于它的查询,则获取 User ;更新用户,但是当通过 UserLocation 查询访问用户时,您会看到旧用户名等,您必须使用 ex: ( user_location.refresh_from_db() ) 来更新您对 UserLocation 的查询。

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2019-11-01
      • 2018-06-24
      相关资源
      最近更新 更多