![](/img/trans.png)
[英]pass user data to serializer in nested serializers when creating object in django rest framework
[英]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號。 我的問題有兩個:
在調用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.