Skip to main content
 首页 » 编程设计

python之如何在 django 的两边设置多对多字段空白=真

2024年10月24日40daizhj

我是 django rest 的新手,今天遇到了一些小麻烦: 假设我们有两个模型:

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 模型设置 blank 属性,但很难对 Tags 做同样的事情。 这样当我尝试类似的东西时

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

它返回我

"entries": [ This field is required ] 

在这种情况下,有什么方法可以创建带有空白“条目”字段的标签对象吗?

提前致谢!


...请注意

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') 

这里是我们的 View (来自 rest_framework 的 View 集以使其快速):

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

所有通过默认路由器(从 rest_framework.routers 导入 DefaultRouter):

router = DefaultRouter() 
router.register(r'entries', views.EntriesView) 
router.register(r'tags', views.TagsView) 
 
urlpatterns = [ 
    url(r'^', include(router.urls)), 
] 

请您参考如下方法:

最终问题出现在 Serializer 中,而不是模型本身。 字段属性 required=False 应该用于强调如果在模型描述期间未指定字段(并且这种方式无法正确序列化),则在对象创建期间字段不是强制性的。

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

感谢大家回复给我指引正确的方向!