簡體   English   中英

使用 django-rest-framework 在 OneToOneField 上插入數據

[英]Insert data on OneToOneField using django-rest-framework

我是這個 django-rest-framework 的新手,我的問題是如何在 views.py 中插入具有一對一關系的數據。 我可以像下面這樣插入數據的正常方式,

def post(self, request,format=None):
  p = Person()
  p.firstname = "John"
  p.middlename = "K"
  p.lastname = "Rambo"
  p.save()
  e = Employee()
  e.code = "emp-002"
  e.person_id = p.id
  e.save()

我無法采用上述方法,因為我想了解更多有關 DRF 的信息。

為了給你更多的想法,請看下面:

我有這個 model

class Person(models.Model):
  firstname = models.CharField(max_length=150, default="")
  middlename = models.CharField(max_length=150, default="")
  lastname = models.CharField(max_length=150, default="")
class Employee(models.Model):
  person = models.OneToOneField(Person, on_delete=models.CASCADE,primary_key=True)
  code = models.CharField(max_length=100, default="")

我有這個序列化程序

class PersonSer(serializers.ModelSerializer):
  class Meta:
    model = Person
    fields = ( 
      'id', 
      'firstname', 
      'middlename', 
      'lastname',)
class EmployeeSer(serializers.ModelSerializer):
  person = PersonSer()
  class Meta:
    model = Employee
    fields = ('code','person')

我有這個觀點

class SaveData(APIView):
  @transaction.atomic
  def post(self,request, format=None):
    p = PersonSer(data=request.data)
    if p.is_valid():
      p.save()
    request.data['person'] = p.data['id']
    request.data['code'] = "Emp-"+str(p.data['id'])
    """
      I expect request.data now equal to
      {
        'person' : 102, # we assume the newly created person id == 102
        'code' : 'Emp-102',
        'firstname' : 'John',
        'middlename' : 'K.',
        'lastname' : 'Rambo'
      }
    """

    es = EmployeeSer(data=request.data)
    if es.is_valid():
      es.save()
    else:
      print(es.errors) # {'person': [ErrorDetail(string='This field is required.', code='required')]}
    """
    I also tried this,
    es = EmployeeSer(data={'person' : p.data, 'code' : 'Sample code'})
    if es.is_valid():
      es.save()
    else:
      print(es.errors) #{'person': {'fullname': [ErrorDetail(string='This field may not be blank.',code='blank')], ]}}
    """
    return Response({'message':'okay'})

request.data 是一個formData,值為

{
  'firstname' : 'John',
  'middlename' : 'K.',
  'lastname' : 'Rambo'
}

您可以重寫 PersonSer 的 create 方法來實現這一點。

class PersonSer(serializers.ModelSerializer):

  ...
  def create(self, validated_data):
      person = Person.objects.create(**validated_data)
      Employee.objects.create(person=person, code=f"Emp-{person.id}")
      return person

您可以將視圖簡化為:

...
@transaction.atomic
  def post(self,request, format=None):
    p = PersonSer(data=request.data)
    p.is_valid(raise_exception=True)
    p.save()
    return Response({'message':'okay'})
...

raise_expection=True如果存在驗證錯誤,將導致序列化程序引發ValidationError異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM