Django:"NOT NULL constraint failed: users_investment.user_id" 错误
Django: "NOT NULL constraint failed: users_investment.user_id" Error
我正在做一个项目,我希望许多用户注册许多 offered_funds,所以我添加了一个 ManyToManyField。我还希望 Django 自动找出哪个用户登录并自动填写用户字段,所以我将其写在我的 views.py 文件中。然而,在这样做时,我遇到了错误:
NOT NULL constraint failed: users_investment.user_id
这是我的 models.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
我的forms.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 中,我评论了导致此问题的代码 issue.I 无法想象为什么 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)
我正在做一个项目,我希望许多用户注册许多 offered_funds,所以我添加了一个 ManyToManyField。我还希望 Django 自动找出哪个用户登录并自动填写用户字段,所以我将其写在我的 views.py 文件中。然而,在这样做时,我遇到了错误:
NOT NULL constraint failed: users_investment.user_id
这是我的 models.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
我的forms.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 中,我评论了导致此问题的代码 issue.I 无法想象为什么 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)