如何在django中设置多个到多个字段空白=两侧为真

时间:2015-12-02 17:40:07

标签: python django django-models many-to-many django-rest-framework

我是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)

我可以为条目模型设置空白属性,但是对标记做同样的操作有困难。 这样,当我尝试类似

之类的东西时
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)),
]

3 个答案:

答案 0 :(得分:1)

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

它适用于我,不是模型,是您正在使用的表单或验证器

答案 1 :(得分:1)

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

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

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

感谢大家的回应,指导我朝着正确的方向前进!

答案 2 :(得分:0)

您需要entries中的TagsSerializer read_only。

你可以这样做:

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