2

私はこれを数日間見ていて、髪を引き抜くようになっているので、助けていただければ幸いです.

userFrom と userTo を持つ package という単純なモデルがあります

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

ただし、pre_save が呼び出されておらず、ユーザー ID のマッピングが行われていないようです。API でログインして新しいパッケージをプッシュしようとすると、エラーが発生します。

私はこれをチュートリアルhttp://django-rest-framework.org/tutorial/4-authentication-and-permissions.htmlにできる限り近づけようとしましたが、うまくいきませんでした。

例外タイプ: IntegrityError 例外値:
列 "userfrom_id" の null 値が not-null 制約に違反しています

ソースを参照して SQL を参照すると、userfrom_id と userto_id の両方が null であることがわかります。

どんなアイデアでも大歓迎です。

J

4

3 に答える 3

3

pre_save() を定義したメソッド。これはビューではありません。これは Model メソッドであり、オブジェクト Package のインスタンスを保存する前に実行する必要があります。そのような変数はモデル環境ではなくビュー関数環境に存在するため、pre_save は変数 "request" の値を認識していません。あなたは物事を混同しています。

次のようなものが必要だと思います:

# 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',)
于 2012-11-13T03:53:07.417 に答える
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()
于 2012-11-14T04:26:14.690 に答える
0

ビュー クラスがCreateModelMixin mixinを継承していることを確認してください。

ドキュメントが述べているように:

pre_save() メソッドは GenericAPIView 自体によって呼び出されるのではなく、CreateModelMixin および UpdateModelMixin クラスの create() メソッドおよび update() メソッドによって呼び出されることに注意してください。

于 2013-12-11T18:23:58.640 に答える