2012-11-13 4 views
2

Я смотрел на это через несколько дней и собираюсь вытащить волосы, чтобы любая помощь была оценена.djangorestframework user_id нарушает не-нулевое ограничение

У меня есть простая модель под названием пакет, который имеет userFrom и userTo

class Package(models.Model): 

    title = models.CharField(max_length=50) 
    packageid = models.CharField(primary_key=True, max_length=64, default=uuid_str, editable=False) 
    userfrom = models.ForeignKey('auth.user', editable=False, related_name='userfrom') 
    userto = models.ForeignKey('auth.user', editable=False, related_name='userto') 

и мои взгляды на пакет имеет следующие назначить отображение

def pre_save(self, obj): 
    print "adding user to object! %s "%self.request.user 
    obj.userfrom = self.request.user 

Hoever, кажется, что pre_save ISN» t, и отображение идентификатора пользователя не происходит. Когда я вхожу в систему с api и пытаюсь нажать новый пакет, я получаю ошибку.

Я попытался сопоставить это как можно ближе к учебнику http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html без везения.

Исключения Тип: IntegrityError Исключения Значение:
нулевого значения в колонке «userfrom_id» нарушает не-нулевое ограничению

просматривает источник в SQL я могу видеть, что userfrom_id и userto_id оба нуля.

Любая идея очень ценится.

J

+0

Не могли бы вы добавить к вопросу, как выглядит ваш взгляд, и что, если что-либо, что у вас есть в вашем словаре настроек REST_FRAMEWORK? –

ответ

3

Я была такая же проблема ...

Вы должны вызвать pre_save в сообщении с сериализованном объекта:

def post(self, request, format=None): 
    serializer = SnippetSerializer(data=request.DATA) 
    if serializer.is_valid(): 
     self.pre_save(serializer.object) #pass in serializer.object 
     serializer.save() 
+1

Спасибо! Я думал, что эта штука была волнующим обратным звонком все время ... спасибо! –

3

метод вы определили pre_save(), это не вид, это метод модели и должно быть выполнено Rigth перед тем экземпляром объекта пакета является inteded быть сохранено. Случается, что pre_save не знает значения переменной «запрос», потому что такая переменная живет в среде функций представления, а не в среде модели. Вы смешиваете вещи.

Я думаю, что нужно что-то вроде этого:

# views.py 
def your_view(request): 

    if request.method == 'POST': 
     package_form = PackageForm(request.POST) 
     if package_form.is_valid(): 
      package = package_form.save(commit=False) 
      package.userfrom = request.user 
      package.save() 

      return render(request, 
       'your_template.html', {} 
      ) 
    package_form = PackageForm() 
    return render(request, 
       'another_template.html', {} 
      ) 

Это будет вид. Будешь нужна форма что-то вроде этого:

class PackageForm(forms.ModelForm): 
    class Meta: 
     model = Package 
     exclude = ('userfrom',) 
0

Make что ваш класс вида наследует CreateModelMixin mixin.

Как doc состояний:

Помните, что метод pre_save() не вызывается самим GenericAPIView, но его называют создать() и обновления() методы на классах CreateModelMixin и UpdateModelMixin.

+1

Вы можете показать рабочий пример кода? Сам по себе это не отвечает на вопрос. – brandonscript

Смежные вопросы