Python 无法查询";用户";:必须是;模型";实例

Python 无法查询";用户";:必须是;模型";实例,python,django,django-filter,Python,Django,Django Filter,我正在尝试在我的私人用户对用户聊天中筛选用户,我正在使用一个型号(user)获取买家的用户名,并使用另一个型号(Profile)获取卖家的用户名 问题是我不明白如何解决这个问题,以及为什么会发生这个问题: ValueError:无法查询“user_39”:必须是“Profile”实例 在我看来: uc = userComment.objects.all().first() users = userComment.objects.filter(Q(buyer=uc.buyer) | Q(selle

我正在尝试在我的私人用户对用户聊天中筛选用户,我正在使用一个型号(
user
获取
买家的用户名,并使用另一个型号(
Profile
)获取
卖家的用户名

问题是我不明白如何解决这个问题,以及为什么会发生这个问题:

ValueError:无法查询“user_39”:必须是“Profile”实例

在我看来:

uc = userComment.objects.all().first()
users = userComment.objects.filter(Q(buyer=uc.buyer) | Q(seller=uc.seller)) #error occurs with this line
pdb.set_trace()

在我的机型上,我不想将
userComment.seller
更改为
ForeignKey(用户,…)

我如何解决这个问题


要求的完整代码:

视图.py

def addComment(request, gig_id):
    gig = Gig.objects.get(id=gig_id)
    uc = userComment.objects.all().first()
    users = userComment.objects.filter(Q(Q(buyer=uc.buyer) & Q(seller=uc.seller)) | Q(Q(buyer=uc.seller) & Q(seller=uc.buyer))).order_by('sent_at')

    if request.method == 'POST':
        form = userCommentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save(buyer=request.user)
            return HttpResponseRedirect('../' + str(gig.id))
    ...
class userCommentForm(forms.Form):
    seller = CommaSeparatedUserField(label=_(u"seller"))
    comment = forms.CharField(label=_(u"comment"), widget=forms.Textarea())

    def save(self, buyer):
        sellers = self.cleaned_data['seller']
        comment = self.cleaned_data['comment']
        message_list = []

        for seller in sellers:
            sl = Profile.objects.get(user=seller) #Connection made here.
            msg = userComment(buyer=buyer, seller=sl, comment=comment,)
            ...
        ...
forms.py

def addComment(request, gig_id):
    gig = Gig.objects.get(id=gig_id)
    uc = userComment.objects.all().first()
    users = userComment.objects.filter(Q(Q(buyer=uc.buyer) & Q(seller=uc.seller)) | Q(Q(buyer=uc.seller) & Q(seller=uc.buyer))).order_by('sent_at')

    if request.method == 'POST':
        form = userCommentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save(buyer=request.user)
            return HttpResponseRedirect('../' + str(gig.id))
    ...
class userCommentForm(forms.Form):
    seller = CommaSeparatedUserField(label=_(u"seller"))
    comment = forms.CharField(label=_(u"comment"), widget=forms.Textarea())

    def save(self, buyer):
        sellers = self.cleaned_data['seller']
        comment = self.cleaned_data['comment']
        message_list = []

        for seller in sellers:
            sl = Profile.objects.get(user=seller) #Connection made here.
            msg = userComment(buyer=buyer, seller=sl, comment=comment,)
            ...
        ...

PDB调试

(Pdb) uc = userComment.objects.all().first()
(Pdb) print('Seller class: %s' % uc.seller.__class__.__name__)
Seller class: Profile
(Pdb) users = userComment.objects.filter(buyer_id=uc.buyer_id)
(Pdb) print(users.count())
3
(Pdb) users = userComment.objects.filter(seller_id=uc.seller_id)
(Pdb) print(users.count())
4
(Pdb) users = userComment.objects.filter(Q(seller_id=uc.seller_id) | Q(buyer_id=uc.buyer_id))
(Pdb) print(users.count())
4
(Pdb) users = userComment.objects.filter(buyer=uc.buyer)
(Pdb) print(users.count())
3
(Pdb) users = userComment.objects.filter(seller=uc.seller)

在您的型号
userComment
中,您有
seller
作为
ForeignKey
Profile
,但听起来您希望它在
User
上:

class userComment(models.Model):
    buyer = models.ForeignKey(User, related_name="buyer", null=True)
    seller = models.ForeignKey(User, related_name="seller", null=True)
编辑:

uc = userComment.objects.all().first()
users = userComment.objects.filter(Q(buyer=uc.buyer) | Q(seller=uc.seller)) #error occurs with this line
对不起,我回答得太快了,您的错误基本上是:您在
buyer
字段和
seller
字段上都使用了条件
uc.buyer
,但是
seller
被定义为
Profile
字段的外键,因此您不能使用用户对象来查询
Profile
字段。也许你想要这个

users = userComment.objects.filter(Q(buyer=uc.buyer) | Q(seller=uc.seller))
重新编辑:

uc = userComment.objects.all().first()
users = userComment.objects.filter(Q(buyer=uc.buyer) | Q(seller=uc.seller)) #error occurs with this line
应该使用
User
作为
userComment
的外键
seller
,因为这就是关系的外观,您可以使用关系获得所需的所有信息。使用
User
作为外键,您可以执行所有操作:

# get a user's profile
profile = user.profile
# query with profile's information on `userComment`
userComment.objects.filter(buyer__profile__name='Tom')

查看django文档。

更新:哦,这是非常不同的代码,看起来您实际的查询是:

userComment.objects.filter(Q(
    Q(buyer=uc.buyer) & Q(seller=uc.buyer)
) | Q(
    Q(buyer=uc.seller) & Q(seller=uc.buyer)
)).order_by('sent_at')
我会尝试:

userComment.objects.filter(Q(
    Q(buyer_id=uc.buyer_id) & Q(seller__user_id=uc.buyer_id)
) | Q(
    Q(buyer_id=uc.seller.user_id) & Q(seller__user_id=uc.buyer_id)
)).order_by('sent_at')

这很奇怪,因为您的代码乍一看似乎很好。我建议尝试以下代码来调试该问题:

uc = userComment.objects.all().first()
print 'Seller class: %s' % uc.seller.__class__.__name__
users = userComment.objects.filter(buyer_id=uc.buyer_id)
print users.count()
users = userComment.objects.filter(seller_id=uc.seller_id)
print users.count()
users = userComment.objects.filter(Q(seller_id=uc.seller_id) | Q(buyer_id=uc.buyer_id))
print users.count()
users = userComment.objects.filter(buyer=uc.buyer)
print users.count()
users = userComment.objects.filter(seller=uc.seller)
print users.count()

有没有其他方法可以用来避免使用
外键(用户,…)
?因为我正在通过“个人资料”模型传递其他数据,所以我编辑了我的答案,看看解释是否合理。是的,最后一个是我现在看到的,很抱歉在帖子中出错了。但正如我所说的,我必须保留“Profile”作为外键,因为我从那里获得了一些数据,而这些数据不在“User”中。您仍然存在问题还是现在一切正常?请显示您的模型代码,以便我们了解
User
Profile
之间的联系。谢谢,请参阅我上面的更新。但是从调试的结果来看,您可以使用我的查询,使用卖方id和买方id来避免您报告的问题。仍然是相同的问题。当您在上面的调试语句中打印出计数时,它才起作用。实际查询给您的错误是什么?现在是说它应该是一个“Profile”实例。