Aka*_*ash 2 json django-rest-framework
添加 depth = 1 后无法正常工作
=> 模型.py 文件
class State(models.Model):
state_name = models.CharField(max_length = 30, unique=True)
def __unicode__(self):
return str(self.state_name)
class City(models.Model):
state = models.ForeignKey(State, related_name='state_city')
city_name = models.CharField(max_length = 30)
def __unicode__(self):
return str(self.city_name)
class Meta:
ordering = ('city_name',)
unique_together = ('state', 'city_name',)
class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
owner = models.ForeignKey('auth.User', related_name='snippets')
state = models.ForeignKey(State,blank=True,null=True)
city = models.ManyToManyField(City)
Run Code Online (Sandbox Code Playgroud)
=> serializers.py 文件
class StateSerializer(serializers.ModelSerializer):
class Meta:
model = State
class CitySerializer(serializers.ModelSerializer):
state_name = serializers.CharField(source='state.state_name', read_only=True)
class Meta:
model = City
class SnippetSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username', read_only=True)
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'owner', 'state', 'city')
depth = 1
Run Code Online (Sandbox Code Playgroud)
我分别在州和城市中添加了 ForeignKey 和 ManyToManyField 字段。它不会在 SnippetSerializer 中保存值,而在 Meta Class 中添加 depth = 1 (它在州和城市字段中保存 Null 值)。当我添加 depth = 1 JSON 时显示相关字段,但在添加新代码段时它无法正常工作。没有深度 = 1 它工作正常。我有复杂的数据库,其中表有许多 ManyToMany 和 ForeignKey 相关字段。请给我建议,以便我可以在 JSON 中获取相关数据。
我有 djangorestframework-3.1.2 版本。我也使用过最新版本,但同样的问题。请给我解决方案,并提前致谢。
我遇到了同样的问题并设法解决了它。由于问题出在depth,我只是更改了init方法中的深度值。
class SnippetSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username', read_only=True)
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'owner', 'state', 'city')
depth = 1
def __init__(self, *args, **kwargs):
super(SnippetSerializer, self).__init__(*args, **kwargs)
request = self.context.get('request')
if request and request.method=='POST':
self.Meta.depth = 0
else:
self.Meta.depth = 1
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我depth根据我提出的请求类型动态更改了。
但是,这是我自己找到的解决方法,我不确定这是否是最佳实践,但只需稍作修改即可解决问题。
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |