【发布时间】:2013-12-16 19:06:10
【问题描述】:
我有一个父资源,它可以有一个以上的一个属性的孩子和一个多于其他属性的孩子。它们看起来像这样:
class RouteResource(ModelResource):
creator = fields.ForeignKey(UserProfileResource, 'creator', full=True)
towns = fields.ToManyField(TownResource, 'towns', full=True, null=True)
型号是:
class Route(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=500)
average_rate = models.FloatField(null=True, blank=True, default=0)
date_created = models.DateTimeField(auto_now=True, auto_now_add=True)
creator = models.ForeignKey(UserProfile)
towns = models.ManyToManyField(Town)
def __unicode__(self):
return self.name
第二个资源是:
class MarkerResource(MultipartResource, ModelResource):
route = fields.ForeignKey(RouteResource, 'route')
picture = fields.FileField(attribute="picture", null=True, blank=True)
它的型号是:
class Marker(models.Model):
picture = models.FileField(upload_to=get_upload_file_name, null=True, blank=True, max_length=500)
description = models.CharField(max_length=500)
longitude = models.FloatField()
latitude = models.FloatField()
order = models.IntegerField()
route = models.ForeignKey(Route)
好的,现在,我可以成功添加城镇路线并且我的资源看起来不错:
{
. . .
. . .
"towns": [
{
"id": 1,
"name": "my town",
"resource_uri": "/api/v1/town/1/"
}
]
}
现在我想通过 POST 添加一个预定义路由作为外键的标记:
{
"description": "Center of earth",
"latitude": 0,
"longitude": 0,
"order": 1,
"picture": null,
"route": {
"id":59
}
}
之后,我的标记成功添加到正确的路线,但我添加的城镇被删除,因此我的路线没有任何城镇:
{
"towns": []
}
【问题讨论】:
-
你试过用
pk替换id吗? -
那么你必须提供完整的资源 uri 而不是字典。这就是美味派如何为相关资源补充水分的方式。
-
是的,我最终选择了那个解决方案。老实说,我不喜欢我必须将 URL 放在一个资源中。这意味着一个资源必须知道另一个资源的 URL,但我相信 ID 就足够了
-
您必须在资源中创建一个覆盖
build_related_resource方法或自定义hydrate_xxx方法的自定义字段(这将获取对象)。
标签: django post foreign-keys tastypie