【发布时间】:2016-03-07 02:05:12
【问题描述】:
我是 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 属性,但对标签执行相同操作有困难。 这样当我尝试类似的东西时
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')
这是我们的观点(来自 rest_framework 的视图集以使其更快):
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)),
]
【问题讨论】:
-
你能把
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。 -
@Caleb_Allen 我尝试将 null=True 添加到 m2m 字段,甚至违反有关 null 属性效果的文档说明......不幸的是它没有工作......
-
您是否在模型上运行过迁移?可能会有影响。
标签: python django django-models many-to-many django-rest-framework