2017-02-27 37 views
0

从Django 1.7升级到1.10和Django Rest Framework 3.5.4后出现问题。问题是,当我尝试权利要求凭证,所述endopint/calims返回500错误与文本:在IntegrityError /权利要求中(1048,“列‘USER_ID’不能为空”)在Django中保存模型时发送当前用户

在urls.py这条路线被添加像这样:

url('^claims', v.ClaimList.as_view(), name='claim_list') 

及相关部件从views.py文件:

class ClaimSerializer(serializers.ModelSerializer): 
    company_name = s.ReadOnlyField(source="ad.company.name") 
    company_address = s.ReadOnlyField(source="ad.company.address") 

    ad_thumbnail = ThumbnailField(source="ad.picture", size="200x200", read_only=True) 

    class Meta: 
     exclude = ('user',) 
     model = m.Claim 


class ClaimSerializerDeep(ClaimSerializer): 

    class Meta: 
     exclude = ('user',) 
     model = m.Claim 
     depth = 2 


class ClaimSerializerFlat(ClaimSerializer): 
    class Meta: 
     exclude = ('user',) 
     model = m.Claim 


@permission_classes((IsAuthenticated,)) 
class ClaimList(Limitable, generics.ListCreateAPIView): 
    model = m.Claim 

    def get_queryset(self): 
     tab = self.request.GET.get("tab", "active") 
     q = m.Claim.objects.filter(user=self.request.user.pk) 
     if tab == "active": 
      q = q.filter(redeemed=False, ad__end__gte=dt.date.today()) 
     elif tab == "used": 
      q = q.filter(redeemed=True) 
     return self.limit(q) 

    def pre_save(self, obj): 
     obj.user = self.request.user 

    def get_serializer_class(self): 
     if self.request.method == "POST": 
      return ClaimSerializerFlat 
     else: 
      return ClaimSerializerDeep 

而且索赔模式是:

class Claim(models.Model): 
    ad = models.ForeignKey("Ad") 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    created = models.DateTimeField(auto_now_add=True) 
    redeemed = models.BooleanField(default=False) 

    def save(self, *args, **kwargs): 
     increase_claimed = False 
     if self.pk is None: 
      increase_claimed = True 
     self.user = User.objects.first() # Temporary hack so that it won't crash 
     super(Claim, self).save(*args, **kwargs) # here is where it crashes 
     if increase_claimed: 
      self.ad.claimed += 1 
      self.ad.save() 

    def __unicode__(self): 
     if self.redeemed: 
      redeemed = u"Redeemed" 
     else: 
      redeemed = u"Not redeemed" 

     return u"{0} - {1} - {2}".format(self.user.email, self.ad.title, redeemed) 

    class Meta: 
     ordering = ("-id",) 

你有什么想法吗?

+0

''q = m.Claim.objects.filter(user = self.request.user.pk)''。您的模型中的用户属性是用户对象的外键,但在视图中,您使用“user = self.request.user.pk”这只是一个id号? – AspiringMat

回答

4
user = models.ForeignKey(settings.AUTH_USER_MODEL) 

您的模型需要用户设置,但显然它不是(已经)。

问题是为什么?

看你的代码,这个作用似乎是相关线路:

def pre_save(self, obj): 
    obj.user = self.request.user 

假设你也升级DRF这是很合理的,这不工作了:http://www.django-rest-framework.org/topics/3.0-announcement/#changes-to-prepost-save-hooks

所以,你必须适应您的代码并按文档中的说明使用perform_create

+0

完美,它的作品。谢谢!没有发现DRF的变化 –

+0

好的,太棒了!为了结束这一章,将答案标记为已接受可能是有意义的;-) – arie

相关问题