Python Django:“;非空约束失败:用户“u investment.user”id;错误

Python Django:“;非空约束失败:用户“u investment.user”id;错误,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我正在做一个项目,我想让很多用户注册许多基金,所以我添加了一个ManyToManyField。我还想让Django自动找出哪个用户登录并自动填充用户字段,所以我将其写在views.py文件中。然而,在这样做时,我遇到了错误: 非空约束失败:users\u investment.user\u id 这是我的models.py: # Not sure if this class is relevant to my question class UserProfile(models.Model):

我正在做一个项目,我想让很多用户注册许多基金,所以我添加了一个ManyToManyField。我还想让Django自动找出哪个用户登录并自动填充用户字段,所以我将其写在views.py文件中。然而,在这样做时,我遇到了错误:

非空约束失败:users\u investment.user\u 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
my forms.py:

class InvestmentForm(forms.ModelForm):
    class Meta:
        model = Investment
        fields = ('offered_fund','amount')
        exclude = ['user']
最后是my 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)

在my views.py中,我对导致此问题的代码进行了注释。我无法想象为什么Django会因为用户字段有一个值(不是null)而生气。有人知道我怎么解决这个问题吗?我还没有用python manage.py刷新来清除我的数据库,但仍然没有运气。谢谢

我想你的问题是你收到的是一个而不是一个完全经过身份验证的用户(Django将自动用一个匿名用户填充
请求。如果一个经过身份验证的用户没有登录,用户
。匿名用户的
id总是
,因此数据库约束失败

您需要首先检查
request.user.is\u authenticated()
是否为匿名用户:

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

用户是否已登录?检查
request.user
中的哪个用户实例。是的,用户已登录,我执行了
print(“request.user”)
检查。否,我已登录,但仍会出现错误,我甚至尝试了
print(“request.user”)
只是为了确定。请求的内容是什么。用户
请求。用户
返回登录用户的名称(我作为您在运行
syncdb
时创建的超级用户登录)。我的models.py中还有一个UsersProfile类。我编辑了我的原始帖子以反映这一点。因此,我非常确定您的问题是缺少迁移或迁移失败。请尝试
manage.py makemigrations
,然后是
manage.py migrate