use*_*778 5 django foreign-key-relationship angularjs django-rest-framework
你好
您能帮我如何禁止创建嵌套对象吗?
我有这样的序列化器:(
员工具有对团队的ForeignKey)
class TeamSerializer(serializers.ModelSerializer):
class Meta:
model = Team
fields = ('id', 'name')
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ('id', 'name', 'surname', 'team')
depth = 1
Run Code Online (Sandbox Code Playgroud)
或者可以是:
class EmployeeSerializer(serializers.ModelSerializer):
team = TeamSerializer()
class Meta:
model = Employee
fields = ('id', 'name', 'surname', 'team')
Run Code Online (Sandbox Code Playgroud)
当我发布json(创建员工)时
{
name: "name",
surname: "surname",
team: {
id: 1,
name: "Web Team"
}
}
Run Code Online (Sandbox Code Playgroud)
员工创建对象对象,但对象团队也......有什么方法可以禁止与员工一起创建团队对象?我只想创建员工并将选定的团队(当前在数据库中)设置为员工
在GET(列表)上,我希望能够检索以下数据:
{
name: "name",
surname: "surname",
team: {
id: 1,
name: "Web Team"
}
Run Code Online (Sandbox Code Playgroud)
不是这样的
{
name: "name",
surname: "surname",
team: 1
}
Run Code Online (Sandbox Code Playgroud)
有没有什么办法来,在Django的REST框架(IAM还使用角)
的问候
当前序列化器:
class TeamSerializer(serializers.ModelSerializer):
class Meta:
model = Team
class EmployeeSerializer(serializers.ModelSerializer):
team = TeamSerializer()
class Meta:
model = Employee
Run Code Online (Sandbox Code Playgroud)
我不能使用serializers.RelatedField()因为它只返回我需要'id'和'name'的unicode(我想)
这是我的POST json:(Restangular.all('employee')。post(data))
data: {
name: "emp1",
photo: "",
skype: "",
surname: "qweqwe",
team: {
id: 1,
name: "Web",
}
}
Run Code Online (Sandbox Code Playgroud)
和DRF返回json:
employee: {
id: 2,
name: "emp1",
photo: "",
skype: "",
surname: "qweqwe",
team: {
id:3, <-- NEW ID!
name: "Web"
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我确定创建了新的团队对象。所以现在怎么办 ?:)
已解决的问题:
class ReadEmployeeSerializer(serializers.ModelSerializer):
team = TeamSerializer()
class Meta:
model = Employee
fields = ('id', 'name', 'surname', 'team',)
class WriteEmployeeSerializer(serializers.ModelSerializer):
def from_native(self, data, files):
data['team'] = data['team']['id']
return serializers.ModelSerializer.from_native(self, data, files)
def to_native(self, obj):
return ReadEmployeeSerializer(obj).data
class Meta:
model = Employee
fields = ('id', 'name', 'surname', 'team',)
Run Code Online (Sandbox Code Playgroud)
post/put 方法使用主键 (WriteEmployeeSerializer) - 在将 dict 替换为主键之前
get 方法使用完整对象 (ReadEmployeeSerializer)