簡體   English   中英

使用Django Rest框架創建對象時將數據更新到序列化器

[英]Update data to serializer when creating object with django rest framework

我的models.py看起來像這樣:

class Activity(models.Model):
    name = models.CharField(max_length=50, unique=True)
    description = model.TextField(max_length=500)

class Jira(models.Model):
    jira_id = models.CharField(max_length=50, unique=True)
    activity = model.ForeignKey(Activity, null=True on_delete=models.SET_NULL)

一個活動可以有多個關聯的Jira票證。因此,我使用外鍵表示一對多關系。

我用來創建新活動的序列化器如下:

class ActivityCreateSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50)
    description = serializers.CharField(max_length=50)
    jira_ticket = serializers.ReadOnlyField()

我的看法如下:

class ActivtyViewSet(viewsets.ViewSet):
    def create(self, request):
        serializer = ActiityCreateSerializer(data=request.data)
        if serializer.is_valid():
           #jira_ticket = make call to jira and get a valid ticket number
           serializer.save()
           return Response(serializer.data, status=status.HTTP_201_CREATED)

顯而易見,在創建新的Activity時,需要對Jira票務系統進行外部API調用,以創建新的jira_ticket。 這成功發生,我得到了jira_ticket號。 我的問題有兩個:

  1. 我如何將Jira票證保存在數據庫中,因為它不屬於序列化程序,並且僅在從外部API調用發出請求后才能獲得?
  2. 由於serializer.data是不可變的,並且我無法將jira_ticket附加到響應字典中,因此如何將jira票證編號添加到序列化器輸出中?

在調用serializer.save()后的視圖中,調用jira票證的api,並使用該API存儲jira票證對象以及從serializer.save()方法返回的活動對象。 您還需要更新響應以包括jira票證數據,由於該視圖將更新響應數據,因此不需要只讀字段。 希望這可以幫助

您可以覆蓋drf的presave hook perform_create() ,類似這樣。

class ActivtyViewSet(viewsets.ViewSet):
    def perform_create(self, serializer):
        serializer(jira_number=get_jira_ticket_number(serializer.data))
        serializer.save()

參考: https : perform_create (搜索perform_create

但是我想,在您的請求-響應周期中調用第三方api不是一個好習慣。 如果出了什么問題會從jira提取ticket_number怎么辦?

我將返回我們擁有的所有數據,並觸發一個后台任務,以從jira獲取ticket_number並用其更新保存的對象。 客戶應繼續輪詢jira ticket_number。 或類似的東西。

暫無
暫無

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

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