簡體   English   中英

Django REST Framework-如何在發布父項時創建或更新外鍵對象

[英]Django REST Framework- how can I create or update a foreign key object when POSTing parent

我目前正在為作業計划系統開發 API 視圖。 每個Job都有一個JobPlan (有開始和結束日期),每個JobPlan可能有多個JobPlanManagers ,分配給用戶來管理所述Job 用戶一可能負責一個月,用戶二可能與用戶 1 重疊,但將工作延長幾周。 因此,當用戶 2 發布他們的新JobPlanManager實例時,他們需要創建一個新的 JobPlan(如果尚不存在計划)或更新現有的JobPlan ,以適當地延長開始和結束時間。 用戶的 POST 數據將包括他們的用戶 ID、作業 ID 以及開始和結束日期,例如:

{
  "manager": (User ID),
  "job_plan": {
    "id": null,
    "job": {
      "id": (existing Job ID)
    },
    "start": "2018-02-01",
    "end": "2018-02-28"
  }
}

此外,我希望此 POST 調用的返回包含 JobPlan 和 Job 的所有字段,嵌套:例如:

{
  "id": (created JobPlanManager instance ID)
  "manager": (User ID),
  "job_plan": {
    "id": (New or existing JobPlan ID)
    "job": {
      "id": (Existing Job ID),
      "name": "Existing Job Name"
    }
    "start": "2018-01-02",
    "end": "2018-02-28"
  }
}

我的模型看起來像:

class Job(models.Model)
    name = models.CharField()


class JobPlan(models.Model):
    job = models.ForeignKey(Job, unique=True)
    start = models.DateField()
    end = models.DateField()


class JobPlanManager(models.Model):
    job_plan = models.ForeignKey(JobPlan)
    manager = models.ForeignKey(User)
    is_open = models.Boolean(default=False)
    delta = models.IntegerField()

對於我的序列化程序,我在單獨的調用中執行此操作(例如-首先創建/更新JobPlan ,然后將返回的 id 與用戶 ID 一起傳遞以創建我的新JobPlanManager ),它們看起來像這樣:

class JobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job
        fields = ('id', 'name',)
        read_only_fields('id')


class JobPlanSerializer(serializers.ModelSerializer):
    job = JobSerializer(many=False)

    class Meta:
        model = JobPlan
        fields = ('id', 'job', 'start', 'end',)
        read_only_fields('id')

    def create(self, validated_data):
        i_job = validated_data.get('job', None)
        start = validated_data.get('start', None)
        end = validated_data.get('end', None)
        if JobPlan.objects.filter(job=i_job).exists():
            jobplan = JobPlan.objects.get(job=i_job)
            jobplan.start = min(jobplan.start, start)
            jobplan.end = max(jobplan.end, end)
            jobplan.save()
        else:
            jobplan = JobPlan.objects.create(job=i_job, start=start, end=end)
        return jobplan

class JobPlanManagerSerializer(serializers.ModelSerializer):
    job_plan = JobPlanSerializer(many=False)

    class Meta:
        model = JobPlanManager
        fields = ('job_plan', 'manager', 'is_open', 'delta',)
        read_only_fields('id')

有沒有人知道一種方法,我可以在一次調用中完成這一切(如上所述)並從上述調用中獲得上述回報?

我用這個技巧讓它工作:

class JobPlanSerializer(serializers.ModelSerializer):
    job = PrimaryKeyRelatedField()

    class Meta:
        ...

    def create(self, validated_data):
        ...

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['job'] = JobSerializer(context=self.context).to_representation(instance.job)
        return ret

發布數據時只需發送"job": (Existing Job ID)

而不是"job": {"id": (existing Job ID)}

暫無
暫無

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

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