Skip to main content
 首页 » 编程设计

python之Django: "NOT NULL constraint failed: users_investment.user_id"错误

2024年10月24日35zhengyun_ustc

我正在做一个项目,我希望许多用户注册许多 offered_funds,所以我添加了一个 ManyToManyField。我还希望 Django 自动确定哪个用户已登录并自动填写用户字段,所以我将其写在我的 views.py 文件中。然而,在这样做时,我遇到了错误:

NOT NULL constraint failed: users_investment.user_id

这是我的模型.py:

# Not sure if this class is relevant to my question 
class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    first_name = models.CharField(max_length=24) 
    last_name = models.CharField(max_length=24) 
    phone_number = models.CharField(max_length=12) 
    account_type = models.CharField(max_length=55, choices=ACCOUNT_TYPES) 
 
    def __str__(self): 
        return self.user.username 
 
class Investment(models.Model): 
    user = models.ManyToManyField(User, blank=True) 
    offered_fund = models.ForeignKey(OfferedFunds) 
    amount = models.IntegerField(default=0) 
    purchase_date = models.DateTimeField(auto_now_add=True) 
 
    def __int__(self): 
        return self.offered_fund.fund_name.name 

我的表格.py:

class InvestmentForm(forms.ModelForm): 
    class Meta: 
        model = Investment 
        fields = ('offered_fund','amount') 
        exclude = ['user'] 

最后,我的 views.py:

def of_details(request, slug): 
    context_dict = {} 
 
    of = get_object_or_404(OfferedFunds, slug=slug) 
    context_dict['of'] = of 
 
    default_state = OfferedFunds.objects.get(slug=slug) 
    form = InvestmentForm(request.POST or None, initial={'offered_fund': default_state}) 
 
    if form.is_valid(): 
        instance = form.save(commit=False) 
        #instance.user = request.user 
        instance.offered_fund = default_state 
        instance.save() 
        instance.user.add(request.user) # Where the problem started 
    context_dict['form'] = form 
 
    return render(request, 'funds/offered-funds-details.html', context_dict) 

在我的 views.py 中,我评论了导致这个问题的代码。我无法想象为什么 Django 会因为用户字段有值(不为空)而生气。有人对我如何解决这个问题有任何想法吗?我还没有使用 python manage.py flush 来清除我的数据库,但仍然没有成功。谢谢

请您参考如下方法:

我认为您的问题是您收到了 anonymous user object而不是经过完全身份验证的用户(如果经过身份验证的用户未登录,Django 将自动使用匿名用户填充 request.user。匿名用户的 id 始终是None - 因此数据库约束失败。

您需要首先检查是否 request.user.is_authenticated() 以确保您的用户不是匿名的:

if request.user.is_authenticated(): 
    instance.user.add(request.user)