depth = 1 不能正常工作,它在 Django Rest Framework 中的 ManyToManyField 和 ForeignKey 字段中保存 Null

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 版本。我也使用过最新版本,但同样的问题。请给我解决方案,并提前致谢。

Ape*_*zzz 5

我遇到了同样的问题并设法解决了它。由于问题出在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根据我提出的请求类型动态更改了。

但是,这是我自己找到的解决方法,我不确定这是否是最佳实践,但只需稍作修改即可解决问题。