2016-04-04 22 views
0

Django REST FrameworkはデータをPOSTするときに値を送信していても値がnullであるというエラーを報告しています。RESTフレームワークへのPOST時にDjango throwsカラムにnullエラーが発生することはありません

Djangoは報告エラーがある:DjangoのRESTフレームワークAPIへのPOSTであることを

django.db.utils.IntegrityError: (1048, "Column 'owner_id' cannot be null") 
 
[04/Apr/2016 18:40:58] "POST /api/items/ HTTP/1.1" 500 226814

角度2コード:

let body = JSON.stringify({ url: 'fred', item_type: 'P', owner_id: 2 }); 
 

 
    let headers = new Headers(); 
 
    headers.append('Content-Type', 'application/json'); 
 

 
    this.http.post('http://127.0.0.1:8000/api/items/', 
 
     body, { 
 
     headers: headers 
 
     }) 
 
     .subscribe(
 
     data => { 
 
      alert(JSON.stringify(data)); 
 
     }, 
 
     err => alert('POST ERROR: '+err.json().message), 
 
     () => alert('POST Complete') 
 
    );

私のDjangoのAPIのビューは次のようになります。

class ItemViewSet(viewsets.ModelViewSet): 
 
    queryset = Item.objects.all().order_by('-date_added') 
 
    serializer_class = ItemSerializer 
 

 
    """ 
 
     Use the API call query params to determing what to return 
 

 
     API params can be: 
 

 
     ?user=<users_id>&num=<num_of_items_to_return>&from=<user_id_of_items_to_show> 
 
    """ 
 

 
    def get_queryset(self): 
 
     this_user = self.request.query_params.get('user', None) 
 
     restrict_to_items_from_user_id = self.request.query_params.get('from', None) 
 
     quantity = self.request.query_params.get('num', 20) 
 

 
     if restrict_to_items_from_user_id is not None: 
 
      queryset = Item.objects.filter(owner=restrict_to_items_from_user_id, active=True).order_by('-date_added')[0:int(quantity)] 
 
     elif this_user is not None: 
 
      queryset = Item.objects.filter(active=True, credits_left__gt=0).exclude(pk__in=Seen.objects.filter(user_id=this_user).values_list('item_id', flat=True))[0:int(quantity)] 
 
     else: 
 
      queryset = Item.objects.filter(active=True, credits_left__gt=0)[0:int(quantity)] 
 

 
     print("User id param is %s and quantity is %s" % (user_id,quantity)) 
 

 
     return queryset

関連するモデルは次のとおりです。

class Item(models.Model): 
 

 
    ITEM_TYPES = (
 
     ('V', 'Vine'), 
 
     ('Y', 'YouTube'), 
 
     ('P', 'Photo'),   # Photo is stored by us on a CDN somewhere 
 
     ('F', 'Flickr'), 
 
     ('I', 'Instagram'), 
 
     ('D', 'DeviantArt'), 
 
     ('5', '500px'), 
 
    ) 
 
    owner   = models.ForeignKey(User, on_delete=models.CASCADE)  # Id of user who owns the item 
 
    title   = models.CharField(max_length=60, default='')   # URL of where item resides (e.g. Vine or YouTube url) 
 
    url    = models.CharField(max_length=250, default='')   # URL of where item resides (e.g. Vine or YouTube url) 
 
    item_type  = models.CharField(max_length=1, choices=ITEM_TYPES) # Type of item (e.g. Vine|YoutTube|Instagram|etc.) 
 
    keywords  = models.ManyToManyField(Keyword, related_name='keywords') 
 
                      # E.g. Art, Travel, Food, etc. 
 
    credits_applied = models.IntegerField(default=10, help_text='Total number of credits applied to this item including any given by VeeU admin') 
 
                      # Records the total number of credits applied to the Item 
 
    credits_left = models.IntegerField(default=10, help_text='The number of credits still remaining to show the item') 
 
                      # Number of credits left (goes down each time item is viewed 
 
    credits_gifted = models.IntegerField(default=0, help_text='The number of credits this item has been gifted by other users') 
 
                      # Number of credits users have gifted to this item 
 
    date_added  = models.DateTimeField(auto_now_add=True)    # When item was added 
 
    liked   = models.IntegerField(default=0)      # Number of times this item has been liked 
 
    disliked  = models.IntegerField(default=0)      # Number of times this item has been disliked 
 
    active   = models.BooleanField(default=True, help_text='If you mark this item inactive please say why in the comment field. E.g. "Inapproriate content"') 
 
                      # True if item is available for showing 
 
    comment   = models.CharField(max_length=100, blank=True)   # Comment to be applied if item is inactive to say why 
 

 
    # Add defs here for model related functions 
 

 
    # This to allow url to be a clickable link 
 
    def item_url(self): 
 
     return u'<a href="%s">%s</a>' % (self.url, self.url) 
 
    item_url.allow_tags = True 
 

 
    def __str__(self): 
 
     return '%s: Title: %s, URL: %s' % (self.owner, self.title, self.url)

私は私と間違っているものを見ることができませんPOST呼び出し、またはDjangoコードを使用します。

EDIT:追加されましたシリアライザコード ここでは、私は角度やフラスコを使用して、同様の問題に遭遇した関連するシリアライザ

class ItemSerializer(serializers.HyperlinkedModelSerializer): 
 
    username = serializers.SerializerMethodField() 
 

 
    def get_username(self, obj): 
 
     value = str(obj.owner) 
 
     return value 
 

 
    def get_keywords(self, obj): 
 
     value = str(obj.keywords) 
 
     return value 
 

 
    class Meta: 
 
     model = Item 
 
     fields = ('url', 'item_type', 'title', 'credits_applied', 'credits_left', 'credits_gifted', 'username', 'liked', 'disliked')

答えて

0

です。あなたのCORSヘッダーがあなたのDjangoアプリ用に正しく設定されていないため、角度アプリがバックエンドに投稿できなくなる可能性があります。フラスコ中で、私はこのコードを使用してそれを修正:

@app.after_request 
def after_request(response): 
    response.headers.add('Access-Control-Allow-Origin', '*') 
    response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization') 
    response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE') 
    return response 

私はジャンゴでこれを行う方法がわからないんだけど、これはおそらくあなたの問題であるので、これはあなたのための偉大な最初のピットストップかもしれません。

+0

おかげジャロン。私は現在、(テスト用の)同じ起源で実行していますが、私のCORS設定はあなたの例に従っています。 –

+0

少なくともあなたはリストからそれをマークすることができます。私は何が間違っている可能性があるか分かりません。私はもう一度見て、私が何かを見たら知らせるでしょう。 –

+0

それは、所有者が外来人であるとはどういうことでしょうか? –

0

あなたのItemSerializerコードは正しいですか?残りは私にとってうまく見えます。

シリアライザのフィールドに「owner_id」があるはずです。

この回答を見て、この方法で関連フィールドを追加してください。

https://stackoverflow.com/a/20636415/5762482

+0

投稿に関連するシリアライザを追加しました。 –

+0

シリアライザのフィールドに「owner_id」があるはずです。 – utkarshmail2052

+0

シリアライザに 'owner_id'を追加すると、実行時に次のエラーが発生します。 "フィールド名' owner_id'はモデル 'Item'には無効です。私のモデルでは、フィールドはownerと呼ばれますが、データベースではowner_idです。 –

1

あなたのシリアライザは、所有者フィールドを持っていないと、あなたのビューには、1を提供していません。あなたのモデルではnullではないので、DBはこれについて不平を言うでしょう。

あなたは、ビューのperform_updateをオーバーライドする必要がありますし、あなたが外部キーであるフィールドのリソースURIを渡す必要がthe owner as extra argument to the serializer

+0

私はこれで自分の深さから外れています。シリアライザの引数として所有者を追加するには、perform_updateをどのように見える必要がありますか? –

+0

これはリンクされたドキュメントに説明されています。少しスクロールする必要があります。その例があります。 – Linovia

+0

Thanks Linovia。 –

1

を追加し、ここで 所有者がFKので、

ownerIns = User.objects.get(id=2) 
let body = JSON.stringify({ url: 'fred', item_type: 'P', owner: ownerIns, owner_id: ownerIns.id }); 
関連する問題