2016-04-04 13 views
0

DERS KİTABI REST Framework, POST, veri POST yaptığımda değer gönderiyorum bile bir değer boş olduğunu bildiren bir hata bildiriyor.Django throws sütun, REST Framework

Django bildiriyor hatadır: Django DİNLENME Çerçeve API POST olduğunu

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

Eğik 2 kodu:

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') 
 
    );

Benim Django API görünümü şuna benzer:

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

ilişkili modelidir: Ben sorunun ne göremiyorum

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)

benim POST çağrısı veya Django kodu.

DÜZENLEME: Eklenen serileştirici kodu İşte Ben Açısal ve Flask kullanarak benzer bir sorun koştum ilişkili serileştirici

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')

cevap

0

olduğunu. Bunun nedeni, CORS başlıklarınızın Django uygulamanız için doğru şekilde ayarlanmamasıdır. Bu, Angular uygulamanızın arka uçta yayınlamasına izin vermez. Flask, ben bu kodu kullanarak sabit:

@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 

Django içinde bunu nasıl emin değilim, ama bu büyük olasılıkla bir konudur çünkü bu sizin için büyük bir ilk durağı olabilir.

+0

Teşekkür Jaron olmalıdır. Şu anda sadece aynı kaynakta koşuyorum (test için) ancak CORS ayarlarım sizin örneğinize göre. –

+0

Darn adama en azından bunu listeden işaretleyebilirsin. Neyin yanlış gittiğinden emin değilim. Başka bir göz atacağım ve bir şey görürsem haber vereceğim. –

+0

Belki bir yabancının sahibi ile ilgisi var mı? –

0

ItemSerializer kodunuz doğru mu? Gerisi bana iyi görünüyor.

Diziselleştirici alanlarınızda 'owner_id' olması gerektiğini düşünüyorum.

Bu cevaba bir göz atın, ilgili alanları bu şekilde ekleyin.

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

+0

İlişkili diziselleştiriciyi postama ekledim. –

+0

Diziselleştirici alanlarınızda 'owner_id' olması gerektiğini düşünüyorum. – utkarshmail2052

+0

Diziselleştiriciye 'owner_id' eklerseniz, çalışma zamanında aşağıdaki hatayı alıyorum "Alan adı' owner_id ",' Item' modeli için geçerli değil. ” Benim modelimde alan sahibi olarak adlandırılıyor ancak veritabanında owner_id. –

1

Kişisel serileştirici bir sahibi alanının bulunmadığı ve görünümü birini sağlamaz. Modelinizde boş olmadığından, DB bunun hakkında şikayette bulunacaktır.

Sen görünümü en perform_update ve Sen yabancı anahtar, burada sahibidir FK olduğu alan için Kaynak URI geçmesi gerekiyor the owner as extra argument to the serializer

+0

Bu konudaki derinliğim bitti. Perform_update'in sahibi, seri hale getiriciye bir argüman olarak eklenmesini ister mi? –

+0

Bağlantılı belgelerde açıklanmıştır - biraz kaydırmanız gerekiyor ve bunun bir örneği olacak. – Linovia

+0

Teşekkürler Linovia. –

1

eklemek iptal edebilir, yani

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