2013-12-19 56 views
3

在Django REST框架中,是否有一種使用可空的ForeignKeys和序列化器的簡單方法?我一直遇到問題(主要是在我的測試中),我將序列化一個具有可空的外鍵的模型,將數據發回DRF,並收到錯誤'錯誤的類型。預計pk值,收到str。'如何在DRF中使用Foreign來使ForeignKey不錯?

實施例:

class Book(models.Model): 
    publisher = models.ForeignKey(Publisher, null=True, blank=True) 

class BookSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Book 

class BookViewSet(viewsets.ViewSet): 
    model = Book 
    serializer_class = BookSerializer 

和通常執行與網址,路線,和所有。

然後,在外殼:

>>> from django.test.client import Client 
>>> client = Client() 
>>> book = Book() 
>>> serializer = BookSerializer(book) 
>>> response = client.post('/books/', serializer.data) 
>>> response.data 
{'publisher': ['Incorrect type. Expected pk value, received str.']} 

看起來這應該工作,因爲被張貼的數據直接從DRF的串行來了。有人遇到過這種情況麼?這裏有什麼最佳實踐?

+1

如果你有需要=假定義的串行現場明確發生什麼呢? –

+0

明確地定義字段與required = False不會改變任何東西 – dustinfarris

回答

2

我認爲這與尚未與保存的Publisher實例關聯的書實例有關。我期望如果你真的創建了一個保存的發佈實例並將其與書實例相關聯,那麼它將按預期工作。

還要注意,序列化將不會執行驗證,只有反序列化纔會這樣做,因此serializer.data仍然會愉快地返回一個序列化的實例。順便提一下,示例代碼中serializer.data的值是多少?

編輯:噢,對不起,我可能是愚蠢 - 這是一個可空 FK畢竟。同樣的問題可以解釋,那麼......示例代碼中serializer.data的值是多少?

鏈接到這個票上django-rest-framework回購:https://github.com/tomchristie/django-rest-framework/issues/1303

+0

嗨,湯姆,這也將在對現有記錄(我認爲間接地回答您的問題)的放入請求中失敗。我已經在GH上發佈了第1303期的更多細節。 – dustinfarris

相關問題