Как программно установить внешний ключ данных POST ModelResource - PullRequest
2 голосов
/ 19 декабря 2011

в приложении 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 для определенной машины.В приведенном выше примере я пытаюсь переопределить метод гидратов для достижения этого (путем извлечения автомобиля текущего пользователя входа в систему).Но казалось, что это не работает.Это правильный способ сделать это?В документе вкусный пирог приведен пример того, как использовать метод гидратов , но это просто простое поле, здесь нет дополнительных указаний на поле отношения (например, внешний ключ).

1 Ответ

2 голосов
/ 19 декабря 2011

Вы пытались передать автомобиль, который хотите сохранить в данных?например,

{"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)
...