2017-01-24 5 views
0

をしようとしているときでは、この問題は、インターネット全体にコメントしているが、それはユーザーにほとんど常にだからこそ、私は知りません。違反の非NULL制約。 ForeighKey(ないユーザーが)ジャンゴRestFrameworkに投稿する

私の場合、問題はユーザーではありません。

私は、このモデルがあります:

class DocumentDetail(models.Model): 
    date = models.DateTimeField(_('date'), auto_now_add=True) 
    note = models.TextField(_('note'), blank=True) 
    checked = models.BooleanField(_('checked'), default=False) 
    details_sample = models.ForeignKey(DocumentDetailSample, related_name='details_sample', 
             verbose_name=_("details_sample"), blank=False) 
    user_id = models.ForeignKey(User, related_name='document_user_id', verbose_name=_('document_user_id'), blank=False) 

    class Meta: 
     ordering = ('date',) 

私は、ユーザーDocumentDetailSampleフィールドをすることができます。

def perform_create(self, serializer): 
    serializer.save(user_id=self.request.user) 

def perform_update(self, serializer): 
    serializer.save(user_id=self.request.user) 

しかし、私はそれがあるべき「details_sample」を知ることができないのでdetails_sampleと、それは、ポストに渡されたものになるはずです。

問題は、ユーザと、私はこれを行うことができるということです。

私はidを投稿体に渡すことができたと思っています。

{ 
    "note" : "Oh, nice", 
    "checked": "True", 
    "details_sample": "1" 
} 

しかし、私はこのエラーを取得する:

django.db.utils.IntegrityError: null value in column "details_sample_id" violates not-null constraint DETAIL: Failing row contains (9, 2017-01-24 14:43:58.75642+00, Oh, nice, t, 2, null).

だから、すべてのものが、details_sampleが働いていました。 :(ここ

そして行う?

class DocumentDetailSerializer(serializers.ModelSerializer): 
    title = serializers.ReadOnlyField(source='details_sample.title') 
    icon = serializers.ReadOnlyField(source='details_sample.icon') 
    priority = serializers.ReadOnlyField(source='details_sample.priority') 
    description = serializers.ReadOnlyField(source='details_sample.description') 
    prefix = serializers.ReadOnlyField(source='details_sample.prefix') 
    advertise = serializers.ReadOnlyField(source='details_sample.advertise') 

    class Meta: 
     model = DocumentDetail 
     fields = (
      'url', 'id', 'date', 'icon', 'checked', 'priority', 'title', 'note', 'description', 'prefix', 'advertise' 
     ) 

私は」:

"1";"2017-01-24 14:40:37.881802+01";"Life is beautiful";"''";"1";"The life is beautiful. And there's also a movie";"This is about life";"{"name": "Chuck", "phone": "123"}" 

誰も私が

EDIT

を行うことができ、ここで私のシリアライザ何を知っています管理サイトでそれを行うことができますが、そこには "使用する"ことができますインスタンス全体問題はPOST中です。 GETもうまくいきます。

+0

何あなたのシリアライザは見えますか? – Linovia

+0

それがあります。おかげで答え:) –

答えて

1

それは単にデータから破棄されるので、あなたのシリアライザ内の任意のdetails_sampleフィールドがありません。

+0

ためいいえ、それは本当だ:)私はそれをテストし、参照してください。そのとおり。ありがとう!それは、私がちょうどIntを書くとしても、インスタンスであることを検出します。再度、感謝します! –

1

私はそれはそれは美しいではありませんが、それは動作しますビューセット

def perform_create(self, serializer): 
    serializer.save(
     details_sample=DocumentDetailSample.objects.filter(Q(id=self.request.data['details_sample']))[0], 
     user_id=self.request.user) 

でこれを書いて解決しました。誰かがより良い方法を知っていれば、教えてください。

関連する問題