Seb*_*ian 6 python django rest django-rest-framework
在Django-REST框架项目中,我尝试使用嵌套关系,并在可浏览的API Web视图中获得"non_field_errors".
代码来自文档的这一部分:http://www.django-rest-framework.org/api-guide/relations#nested-relationships
models.py:
from django.db import models
class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks')
order = models.IntegerField()
title = models.CharField(max_length=100)
#duration = models.IntegerField()
class Meta:
unique_together = ('album', 'order')
ordering = ('order',)
def __unicode__(self):
return '%d: %s' % (self.order, self.title)
Run Code Online (Sandbox Code Playgroud)
serializers.py:
from rest_framework import serializers
from myapp.models import Album, Track
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('order', 'title')
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
Run Code Online (Sandbox Code Playgroud)
错误(在../albums):
Track输入字段标记为红色,并显示错误消息:non_field_errors.
单击OPTIONS按钮可显示实际且正确的数据结构:
轨道嵌套有适当的属性
可浏览浏览器视图的原始数据输入显示:
{
"album_name": "",
"artist": "",
"tracks": null
}
Run Code Online (Sandbox Code Playgroud)
发布一些有效的原始数据实际上是有效的.但是,如果Web界面表单也能正常工作,那就更好了.特别是因为我想知道是否有一些有趣的事情发生了.
先感谢您!
我也经历过这个问题。消除错误的一种方法是使用:
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.RelatedField(many=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
Run Code Online (Sandbox Code Playgroud)
但是,这会删除嵌套的轨道字段并仅显示轨道的字符串表示形式。
编辑:我明白了。你想要的是这样的:
class AlbumSerializer(serializers.ModelSerializer):
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
read_only_fields = ('tracks',)
depth = 1
Run Code Online (Sandbox Code Playgroud)
这将导致轨道嵌套,而不会引发 UI 错误。
| 归档时间: |
|
| 查看次数: |
2110 次 |
| 最近记录: |