如何以编程方式设置ModelResource POST数据的外键

时间:2011-12-19 00:30:01

标签: django api tastypie

在django-tastypie应用程序中,我有以下Django模型:

class Car(models.Model):
    name=models.CharField('name',max_length=64)

class CarTrack(models.Model):
    car=models.ForeignKey(Car)
    tdata=models.CharField('track data',max_length=255)
    created = models.DateTimeField('created time',auto_now_add=True)

我创建了以下tastypie资源:

class CarRsc(ModelResource):
    class Meta:
        queryset=Car.objects.all()
        resource_name='car'
        authentication = Authentication()
        authorization=Authorization()

class CarTrackRsc(ModelResource):
    car=fields.ForeignKey(CarRsc, 'car')
    class Meta:
        queryset=Detection.objects.all()
        resource_name='track'
        authentication = Authentication()
        authorization=Authorization()
    def hydrate(self, bundle):
        if not bundle.obj.pk:
            bundle.obj.car=bundle.request.user.get_profile().car
        return bundle

当客户发布新的CarTrackRsc(例如,{“tdata”:“blablabla”})时,我想将CarTrack的外键设置为某辆车。在上面的例子中,我尝试覆盖水合物方法来实现它(通过取出当前登录用户的汽车)。但似乎它不起作用。这是正确的方法吗? tastypie文档确实提供了关于如何use the hydrate method的示例,但它只是简单的字段,没有给出关系字段(例如,外键)的进一步提示。

1 个答案:

答案 0 :(得分:2)

您是否尝试将要保存的汽车传递给数据?例如

{"tdata": "blablabla", "car":"/api/v1/car/<<CAR_ID>>/"}

否则我已经使用obj_create从请求中设置当前用户,这应该可行,请尝试以下操作:

def obj_create(self, bundle, request=None, **kwargs):
    return super(CarTrackRsc, self).obj_create(bundle, request, car=request.user.get_profile().car)