Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django rest框架-通过单个API调用创建具有外键的资源_Django_Api_Rest - Fatal编程技术网

django rest框架-通过单个API调用创建具有外键的资源

django rest框架-通过单个API调用创建具有外键的资源,django,api,rest,Django,Api,Rest,我在创建“估计”资源时遇到问题。基本上,我试图实现的是通过一个API调用来创建一个“Estimate”实例,它有3个外键,并且更愿意使用ModelViewSet来利用使用它所附带的所有方法(POST、GET、PUT、DELETE、PATCH) 例如: 使用以下数据拨打一次POST电话: {用户:,属性:,估计类型:,消息:“测试消息”} /空气污染指数/估计/ 我设法将API配置为检索我所需的所有详细信息,除了“User”对象详细信息之外,我只获取URL,但我想这没关系,因为我可以在单独的调用中

我在创建“估计”资源时遇到问题。基本上,我试图实现的是通过一个API调用来创建一个“Estimate”实例,它有3个外键,并且更愿意使用ModelViewSet来利用使用它所附带的所有方法(POST、GET、PUT、DELETE、PATCH)

例如:

使用以下数据拨打一次POST电话: {用户:,属性:,估计类型:,消息:“测试消息”} /空气污染指数/估计/

我设法将API配置为检索我所需的所有详细信息,除了“User”对象详细信息之外,我只获取URL,但我想这没关系,因为我可以在单独的调用中获取用户详细信息

我有点困惑,我想了解通过一次调用创建“Estimate”实例的正确方法是什么。我应该重写“Estimate”类的save方法吗

非常感谢所有建议

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请求发送到 /空气污染指数/估计/

检索以下内容:

    [
  {
    "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"
}
{
“用户”:,
“财产”:,
“估算类型”:,
“消息”:“foo bar”
}
restframework 2.x不支持写入嵌套序列化程序(就像您所做的那样)

了解如何创建可写的RelatedField类: