如何在 django 的两边设置多对多字段空白=真
How to set Many to Many field blank=True on both sides in django
我是 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"
它returns我
"entries": [ This field is required ]
在这种情况下,有什么方法可以创建带有空白 "entries" 字段的标签对象吗?
提前致谢!
...请注意
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 import DefaultRouter):
router = DefaultRouter()
router.register(r'entries', views.EntriesView)
router.register(r'tags', views.TagsView)
urlpatterns = [
url(r'^', include(router.urls)),
]
>>> from testapp.models import Tags, Entries
>>> t = Tags.objects.create(tag = 'TAG')
>>> t
<Tags: Tags object>
它对我有用,不是模型,是表单,或者您正在使用的验证器
您需要在 TagsSerializer
中制作 entries
read_only。
你可以这样做:
class TagsSerializer(serializers.HyperlinkedModelSerializer):
entries = EntriesSerializer(many=True, read_only=True)
class Meta:
model = Tags
fields = ('url', 'tag', 'entries')
最终问题出现在序列化程序中,而不是模型本身。
field 属性 required=False 应该用来强调如果在模型描述期间未指定字段,则在对象创建期间该字段不是必需的(并且这种方式无法正确序列化) .
class TagsSerializer(serializers.HyperlinkedModelSerializer):
entries = EntriesSerializer(many=True, required=False)
class Meta:
model = Tags
fields = ('url', 'tag', 'entries')
感谢大家回复给我指引方向!
我是 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"
它returns我
"entries": [ This field is required ]
在这种情况下,有什么方法可以创建带有空白 "entries" 字段的标签对象吗?
提前致谢!
...请注意
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 import DefaultRouter):
router = DefaultRouter()
router.register(r'entries', views.EntriesView)
router.register(r'tags', views.TagsView)
urlpatterns = [
url(r'^', include(router.urls)),
]
>>> from testapp.models import Tags, Entries
>>> t = Tags.objects.create(tag = 'TAG')
>>> t
<Tags: Tags object>
它对我有用,不是模型,是表单,或者您正在使用的验证器
您需要在 TagsSerializer
中制作 entries
read_only。
你可以这样做:
class TagsSerializer(serializers.HyperlinkedModelSerializer):
entries = EntriesSerializer(many=True, read_only=True)
class Meta:
model = Tags
fields = ('url', 'tag', 'entries')
最终问题出现在序列化程序中,而不是模型本身。 field 属性 required=False 应该用来强调如果在模型描述期间未指定字段,则在对象创建期间该字段不是必需的(并且这种方式无法正确序列化) .
class TagsSerializer(serializers.HyperlinkedModelSerializer):
entries = EntriesSerializer(many=True, required=False)
class Meta:
model = Tags
fields = ('url', 'tag', 'entries')
感谢大家回复给我指引方向!