【问题标题】:how to add data to child model along with parent mode?如何将数据与父模式一起添加到子模型?
【发布时间】:2019-03-14 11:18:02
【问题描述】:

我正在使用 Django REST 框架。我想将数据与父模型一起添加到子模型中。基本上一次创建两条记录。

models.py

class Visit(models.Model):
   name = models.CharField(max_length=200)
   gender = models.CharField(choices=GENDER_CHOICE, max_length=1)
   mobile = models.CharField(max_length=18,default="")
   email = models.CharField(max_length=256, null=True, blank=True)
   address = models.TextField(null=True, blank=True)
   visit_type = models.IntegerField(choices=VISIT_TYPE)
   visit_purpose = models.CharField(max_length=250)
   visitor_photo = models.FileField(upload_to="visitor/",null=True, blank=True)
   id_photo = models.FileField(upload_to="id_card/",null=True, blank=True)
   date_created = models.DateTimeField(default=timezone.now, editable=False)

class Status(models.Model):
   visit = models.ForeignKey(Visit,on_delete=models.CASCADE)
   description = models.CharField(max_length=200)
   from_time = models.DateField()
   to_time = models.DateTimeField(null=True, blank=True)
   aproved = models.BooleanField(default=False)
   visit_complete = models.BooleanField(default=False)
   exit_time = models.DateTimeField(null=True, blank=True)
   date_created = models.DateTimeField(default=timezone.now, editable=False)

serializers.py

class StatusSerializers(serializers.ModelSerializer):
       class Meta:
         model = Status
         fields = "__all__"
class VisitSerializers(serializers.ModelSerializer):
   visit = StatusSerializers(many=True)
   class Meta:
       model = Visit
       fields = "__all__"

   def create(self, validated_data):
      print(validated_data)
      model_b = Visit.objects.create(**validated_data)
      # print(self.context.request.data.get('description'))
      child_model_data = {
         'description': self.context.request.data.get('description'),
      }
      child_model_serializer = StatusSerializers(data=child_model_data)
      child_model_serializer.is_valid(raise_exception=True)
      child_model_serializer.save(status=model_b)

      return model_b

views.py

  @api_view(['GET', 'POST'])
  def create_visitor(request):
    if request.method == 'GET':
       visitor = Visit.objects.all()
       serializer = VisitSerializers(visitor,context={'request': request},many=True)
       return Response(serializer.data)
    elif request.method == 'POST':
       serializer = VisitSerializers(data=request.data,context={'request': request})
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors,

status=status.HTTP_400_BAD_REQUEST) 在上面的代码中,我可以创建子记录,即状态模型记录,但我不知道如何在创建过程中添加其他字段。

【问题讨论】:

  • 您想在状态模型和访问模型中添加记录吗?
  • 是的,我需要一次性创建两个记录。我能够在状态模型中创建记录(忽略其他字段)但不知道如何将其他字段数据添加到状态记录字段。

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


【解决方案1】:

在您的serializer 子模型数据可以在self.context.request.data 中找到,您可以简单地使用子序列化程序来验证并保存在数据库中。

class VisitSerializers(serializers.ModelSerializer):
   class Meta:
       model = Visit
       fields = "__all__"

   def create(self, validated_data):
      print(validated_data)
      model_b = Visit.objects.create(**validated_data)
      child_model_data = {
         'field': self.context['request'].data.get('your_field');
         .....
      }
      child_model_serializer = ChildSerializer(data=child_model_data)
      child_model_serializer.is_valid(raise_exception=True)
      child_model_serializer.save()

      return model_b

更新你需要多处改变

首先在您看来,在后方法序列化程序初始化中,您需要传递上下文对象。

  @api_view(['GET', 'POST'])
  def create_visitor(request):
     if request.method == 'GET':
        visitor = Visit.objects.all()
        serializer = VisitSerializers(visitor,context={'request': request},many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        serializer = VisitSerializers(data=request.data, context={'request': request})
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

然后在您的 VisitSerializer 中

class VisitSerializers(serializers.ModelSerializer):
   visit = StatusSerializers(many=True)  # not sure why you did this, this should be removed i guess
   class Meta:
       model = Visit
       fields = "__all__"

   def create(self, validated_data):
      print(validated_data)
      model_b = Visit.objects.create(**validated_data)
      # print(self.context.request.data.get('description'))
      child_model_data = {
         'description': self.context.request.data.get('description'),
          'status': model_b
          # and make sure all other necessary fields.
      }
      child_model_serializer = StatusSerializers(data=child_model_data)
      child_model_serializer.is_valid(raise_exception=True)
      child_model_serializer.save()

      return model_b

【讨论】:

  • 你能看到这篇文章吗stackoverflow.com/questions/55161052/…@shakil
  • 如何传递数据 {"parent_fileds":"something"} 如何传递子模型。我也没有看到父模型通过 FK 与子模式相关
  • @CliftonAvilD'Souza 您正在使用drf-serializer 对吗?然后在你request 中你可以传递你的父模型和子模型的相关字段。
  • 文件 "/home/netzary/cliftonprojects/mvisiter/api/views.py",第 25 行,在 create_visitor serializer.save() 文件 "/home/netzary/cliftonprojects/venvs/mvisiter/lib /python3.6/site-packages/rest_framework/serializers.py”,第 214 行,保存 self.instance = self.create(validated_data) 文件“/home/netzary/cliftonprojects/mvisiter/api/serializer.py”,行30、在create print(self.context.request.data.get('description')) AttributeError: 'dict' object has no attribute 'request'
  • @CliftonAvilD'Souza 请确保您在 post 序列化程序中传递 context={'request': request},就像您的 get 方法一样。
【解决方案2】:

您可以在序列化程序中添加额外的字段以及默认字段。对于反向关系,您可以添加这样的字段

class VisitSerializers(serializers.ModelSerializer):
   status = StatusSerializer(many=True)
   class Meta:
       model = Visit

您可以像这样将数据传递给 VisitSerializer。 {, 状态: [, ]}

【讨论】:

  • { "name":"Clifton", "gender":"M", "visit_type":1, "visit_ purpose":"xxxxxxx", status:["description":"xxxxxxx", ] } 得到错误为“详细信息”:“JSON 解析错误 - 期望用双引号括起来的属性名称:第 6 行第 1 列(字符 77)”}
  • status 应该用引号引起来。 “状态”
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2019-03-31
  • 2018-09-13
  • 2012-04-11
  • 2018-08-24
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多