【问题标题】:Django TastyPie deletes children if adding other如果添加其他,Django TastyPie 会删除孩子
【发布时间】: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


【解决方案1】:

您可以:

  • 为键的值提供完整的资源 uri,即:route: "/api/v1/route/59/"
  • 覆盖MarkerResourcehydrate_route 方法以返回给定字典传递的对象。
  • 根据fields.ForeignKey 创建一个自定义字段,以实现自定义build_related_resource 行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2011-12-02
    • 2021-05-08
    • 2012-08-27
    相关资源
    最近更新 更多