django rest framework - 通过单个 API 调用创建具有外键的资源
django rest framework - create a resource that has foreign keys with a single API call
我在创建 "Estimate" 资源时遇到问题。基本上,我想要实现的是进行一次 API 调用来创建一个 "Estimate" 实例,该实例具有 3 个外键,并且更愿意使用 ModelViewSet 来利用所有方法使用它(POST、GET、PUT、DELETE、PATCH)。
示例:
使用以下数据进行一次 POST 调用:
{用户:,属性:,estimate_type:,消息:"test message"}
/api/estimates/
我设法配置 API 来检索我需要的所有详细信息,但 "User" 对象详细信息除外,而我只得到 URL,但我想没关系,因为我可以在单独的调用中获取用户详细信息。
我有点困惑,想了解通过一次调用创建 "Estimate" 实例的正确方法是什么。我应该覆盖 "Estimate" class 的保存方法吗?
非常感谢所有建议。
Django==1.7.6
djangorestframework==3.1.0
这些是我的模型:
class Property(models.Model):
user = models.ForeignKey(User)
address = models.CharField(max_length=100)
def __str__(self):
return self.address
class EstimateType(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Estimate(models.Model):
user = models.ForeignKey(User)
property = models.ForeignKey(Property)
estimate_type = models.ForeignKey(EstimateType)
message = models.TextField(max_length=144)
def __str__(self):
return "{} {}".format(self.user.username, self.property.address1)
这些是序列化程序:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('pk','username', 'email','first_name', 'last_name', 'is_staff')
class PropertySerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Property
fields = ('pk','address','user')
class EstimateTypeSerializer(serializers.ModelSerializer):
class Meta:
model = EstimateType
fields = ('pk', 'name')
class EstimateSerializer(serializers.HyperlinkedModelSerializer):
property = PropertySerializer()
service = EstimateTypeSerializer()
class Meta:
model = Estimate
fields = ('pk','user','property','service', 'message')
视图集:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class PropertyViewSet(viewsets.ModelViewSet):
queryset = Property.objects.all()
serializer_class = PropertySerializer
class EstimateTypeViewSet(viewsets.ModelViewSet):
queryset = EstimateType.objects.all()
serializer_class = EstimateTypeSerializer
class EstimateViewSet(viewsets.ModelViewSet):
serializer_class = EstimateSerializer
def get_queryset(self):
queryset = Estimate.objects.filter(user=self.request.user)
return queryset
正在发送 GET 请求至
/api/estimate/
检索以下内容:
[
{
"pk": 3,
"user": "http://localhost:8000/users/2/",
"property": {
"pk": 3,
"address": “123 Fake street",
"user": {
"pk": 2,
"username": “admin”,
"email": “admin@foo.com”,
"first_name": “Foo”,
"last_name": “Bar”,
"is_staff": true
}
},
“estimate_type”: {
"pk": 1,
"name": “basic”
},
"message": "Lorem Ipsum is simply dummy text of the printing and typesetting \n”
}
]
要创建链接到其他现有记录的新估算,您只需发送这样的对象,仅使用标识相关对象的主键:
{
"user": <user pk>,
"property": <property pk>,
"estimate_type": <estimate type pk>,
"message": "foo bar"
}
restframework 2.x 不支持写入嵌套的序列化程序 - 正如您所做的那样。
看看如何创建可写的 RelatedField class:http://www.django-rest-framework.org/api-guide/relations/#custom-relational-fields
我在创建 "Estimate" 资源时遇到问题。基本上,我想要实现的是进行一次 API 调用来创建一个 "Estimate" 实例,该实例具有 3 个外键,并且更愿意使用 ModelViewSet 来利用所有方法使用它(POST、GET、PUT、DELETE、PATCH)。
示例:
使用以下数据进行一次 POST 调用: {用户:,属性:,estimate_type:,消息:"test message"} /api/estimates/
我设法配置 API 来检索我需要的所有详细信息,但 "User" 对象详细信息除外,而我只得到 URL,但我想没关系,因为我可以在单独的调用中获取用户详细信息。
我有点困惑,想了解通过一次调用创建 "Estimate" 实例的正确方法是什么。我应该覆盖 "Estimate" class 的保存方法吗?
非常感谢所有建议。
Django==1.7.6 djangorestframework==3.1.0
这些是我的模型:
class Property(models.Model):
user = models.ForeignKey(User)
address = models.CharField(max_length=100)
def __str__(self):
return self.address
class EstimateType(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Estimate(models.Model):
user = models.ForeignKey(User)
property = models.ForeignKey(Property)
estimate_type = models.ForeignKey(EstimateType)
message = models.TextField(max_length=144)
def __str__(self):
return "{} {}".format(self.user.username, self.property.address1)
这些是序列化程序:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('pk','username', 'email','first_name', 'last_name', 'is_staff')
class PropertySerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Property
fields = ('pk','address','user')
class EstimateTypeSerializer(serializers.ModelSerializer):
class Meta:
model = EstimateType
fields = ('pk', 'name')
class EstimateSerializer(serializers.HyperlinkedModelSerializer):
property = PropertySerializer()
service = EstimateTypeSerializer()
class Meta:
model = Estimate
fields = ('pk','user','property','service', 'message')
视图集:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class PropertyViewSet(viewsets.ModelViewSet):
queryset = Property.objects.all()
serializer_class = PropertySerializer
class EstimateTypeViewSet(viewsets.ModelViewSet):
queryset = EstimateType.objects.all()
serializer_class = EstimateTypeSerializer
class EstimateViewSet(viewsets.ModelViewSet):
serializer_class = EstimateSerializer
def get_queryset(self):
queryset = Estimate.objects.filter(user=self.request.user)
return queryset
正在发送 GET 请求至 /api/estimate/
检索以下内容:
[
{
"pk": 3,
"user": "http://localhost:8000/users/2/",
"property": {
"pk": 3,
"address": “123 Fake street",
"user": {
"pk": 2,
"username": “admin”,
"email": “admin@foo.com”,
"first_name": “Foo”,
"last_name": “Bar”,
"is_staff": true
}
},
“estimate_type”: {
"pk": 1,
"name": “basic”
},
"message": "Lorem Ipsum is simply dummy text of the printing and typesetting \n”
}
]
要创建链接到其他现有记录的新估算,您只需发送这样的对象,仅使用标识相关对象的主键:
{
"user": <user pk>,
"property": <property pk>,
"estimate_type": <estimate type pk>,
"message": "foo bar"
}
restframework 2.x 不支持写入嵌套的序列化程序 - 正如您所做的那样。
看看如何创建可写的 RelatedField class:http://www.django-rest-framework.org/api-guide/relations/#custom-relational-fields