2014-06-14 80 views
0

我想使用DRF可瀏覽API POST表單在兩個表(日誌和發佈)中創建條目。Django REST框架和從POST表單創建兩個表項

下面的例子是人爲的,但它概述了我想要做的。

class Post(models.Model): 
    info = models.CharField() 

class Log(TimeStampedModel): 
    ip = models.GenericIPAddressField(('IP Address')) 
    name = models.CharField() 
    data = models.ForeignKey(Post)          

我想使用可瀏覽的API來提交表單來創建日誌條目。下面是串行:

class PostSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Post 
     fields = ('info',) 

class LogSerializer(serializers.ModelSerializer):       
    data = serializers.Field() 

    class Meta: 
     model = Log 
     fields = ('ip', 'name', 'data') 

的問題與上面是serializer.Field是隻讀所以POST表單上顯示不出來。如果我將它更改爲CharField,它會顯示出來,但是我得到一個錯誤,因爲Post的一個實例不僅僅是Post對象的一個​​字段。

這裏是我的觀點:

class LogMixin(object): 
    queryset = Log.objects.all()           
    serializer_class = LogSerializer 



class LogList(LogMixin, ListCreateAPIView): 
    pass 


class LogDetail(LogMixin, RetrieveUpdateDestroyAPIView): 
    pass 

什麼是這樣做的正確方法是什麼?

回答

1

從我可以告訴你想創建一個嵌套的日誌對象。有2種方式這樣做的:

  1. 發送2個POST請求,一個創建後,另以創建日誌從API包含在接收到HTTP 200個數據。
  2. (Django和最好的方法)將數據全部發送到一個POST並解析它的服務器端。 Django Rest框架爲您提供幫助。

我已更改您的代碼,以便它能正常工作。 Source

class LogSerializer(serializers.ModelSerializer):       
    class Meta: 
     model = Log 
     fields = ('ip', 'name') 


class PostSerializer(serializers.ModelSerializer): 
    log = LogSerializer() 
    class Meta: 
     model = Post 
     fields = ('info', 'log') 

views.py

import generics 

class PostCreateAPIView(generics.CreateAPIView): 
    model = Post 
    serializer_class = PostSerializer 

然後你就可以發送一個請求POST包含 '信息', 'IP' 和 '名稱'。

+0

嘗試過,但DRF POST表單只顯示IP和名稱字段。信息字段不會以DRF格式顯示。我也用我的api視圖更新了我的問題。謝謝。 – smithy

+0

@smithy它看起來像你的意見不涉及你的後序列化。正因爲如此,你只是發送有關你的日誌對象的數據,但沒有關於你的Post對象。我將更新我的代碼以包含必要的View類。 – robert

+0

我試過了,我只是得到了DRF表單上顯示的信息和日誌,並在日誌字段下顯示「non_field_errors」錯誤。謝謝。 – smithy