2

我是新來的Django休息,今天中遇到了一點小麻煩設置多對多字段爲空=真兩側: 比方說,我們有兩種型號:如何在Django

class Tags(models.Model): 
    tag_text = models.CharField(name='tag', max_length=30) 

class Entries(models.Model): 
    entry_header = models.CharField(name='header', max_length=30) 
    pub_date = models.DateTimeField(auto_now_add=True) 
    entry_text = models.TextField(blank=True, null=True) 
    entry_tags = models.ManyToManyField(Tags, related_name='entries', blank=True) 

我可以設置空白屬性爲Entries模型,但對標籤做同樣的操作有困難。 當我試圖像

http --json POST http://127.0.0.1:8000/tags/ tag_text="tag with no entry" 

它返回我

"entries": [ This field is required ] 

有什麼辦法,我可以creatre標籤,在這種情況下空白「項」 Field對象,這種方式?

預先感謝您!


...並請注意

http --json POST http://127.0.0.1:8000/entries/ header="entry with no tags" 

給出所需的響應

從rest_framework串行會在這種情況下很簡單,以及:

class EntriesSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Entries 
     fields = ('url', 'header', 'entry_text', 'pub_date', 'entry_tags') 

class TagsSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Tags 
     fields = ('url', 'tag', 'entries') 

這裏是我們的觀點(來自rest_framework的視圖使其更快):

class EntriesView(viewsets.ModelViewSet): 
    queryset = Entries.objects.all() 
    serializer_class = EntriesSerializer 

class TagsView(viewsets.ModelViewSet): 
    queryset = Tags.objects.all() 
    serializer_class = TagsSerializer 

所有去throught默認路由器(從rest_framework.routers導入defaultrouter中):

router = DefaultRouter() 
router.register(r'entries', views.EntriesView) 
router.register(r'tags', views.TagsView) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
] 
+0

您可以將'tag_text = models.CharField(name ='tag',max_length = 30)''設置爲'tag_text = models.CharField(name ='tag',max_length = 30,blank = True,null = True) '? 或者您可能需要在ManyToManyField上添加'null = True'。 –

+0

@Caleb_Allen我試圖在m2m字段中添加null = True,即使針對關於null屬性效果的文檔說明...並且它不能工作...... –

+0

您是否在模型上運行遷移?可能會有影響。 –

回答

1

最終的問題似乎是序列化,而不是模式本身。 field property required = False應該用來強調如果在模型描述期間沒有指定它(並且這種方式不能被正確序列化),那麼在對象創建期間該字段不是強制性的。

class TagsSerializer(serializers.HyperlinkedModelSerializer): 
entries = EntriesSerializer(many=True, required=False) 

class Meta: 
    model = Tags 
    fields = ('url', 'tag', 'entries') 

感謝大家的迴應引導我朝着正確的方向發展!

1
>>> from testapp.models import Tags, Entries 
>>> t = Tags.objects.create(tag = 'TAG') 
>>> t 
<Tags: Tags object> 

它爲我,是不是模型,是形式,或者你正在使用的驗證

+0

就我從文檔中知道:null沒有效果,因爲沒有辦法需要在數據庫級別的關係 –

+0

和是的,我已經試過這樣做 –

+0

你是對的,它的工作原理。你可以發佈其他代碼嗎? – Zartch

0

您需要在您的TagsSerializer中使用entries read_only。

你可以這樣做:

class TagsSerializer(serializers.HyperlinkedModelSerializer): 
    entries = EntriesSerializer(many=True, read_only=True) 
    class Meta: 
     model = Tags 
     fields = ('url', 'tag', 'entries') 
+0

好主意!它允許創建對象,但從邏輯上講,這個字段在真實情況下不會真正地read_only。 –