2017-01-09 22 views
0

我想對我的私人用戶到用戶聊天,我發現了buyer的用戶名與模型(Userseller過濾用戶與另一個模型的用戶名(Profile)。無法查詢「用戶」:必須是「模式」例如

的問題是,我不明白我怎麼能解決這個問題,爲什麼會出現:

ValueError: Cannot query "user_39": Must be "Profile" instance.

在我的觀點:

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()

(Pdb) uc.seller 
<Profile: user_39> 
(Pdb) uc.buyer 
<User: user_4> 

這是我的兩個模型。

class Profile(models.Model): 
    name = models.CharField(max_length=120) 
    user = models.OneToOneField(User, null=True, blank=True) 

class userComment(models.Model): 
    buyer = models.ForeignKey(User, related_name="buyer", null=True) 
    seller = models.ForeignKey(Profile, related_name="seller", null=True) 
    sent_at = models.DateTimeField(auto_now_add=True) 
    comment = models.TextField(max_length=255, null=True) 

在我的模型,我不想改變userComment.sellerForeignKey(User, ...)

我怎樣才能解決這個問題?


的要求的完整代碼:

views.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)) 
    ... 

forms.py

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) 

回答

2

在你的模型userComment你有sellerForeignKeyProfile,但聽起來像你希望它是在User

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

編輯:

對不起我回答得太快了,你的錯誤基本上說:你在上用uc.buyer這個標準查詢字段和seller字段,但seller被定義爲Profile的外鍵,因此您無法使用用戶對象在Profile字段上進行查詢。也許你想要這個呢?

users = userComment.objects.filter(Q(buyer=uc.buyer) | Q(seller=uc.seller)) 

重新編輯:

應該使用User爲外鍵selleruserComment,因爲這是一個關係樣子,你可以得到你需要使用關係的所有信息。隨着User爲外鍵,你可以做的一切:在how to query across relationships

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

檢查Django的文檔。

+0

是不是有另一種方式,以便不使用'ForeignKey(User,...)'?因爲我通過「Profile」模型傳遞其他數據 – Lindow

+0

我編輯了我的答案,看看解釋是否有意義。 –

+0

是的,最後一個是我現在擁有的那個,抱歉在帖子中犯了一個錯誤。但正如我所說的,我必須保留「Profile」作爲ForeignKey,因爲我從那裏得到了一些不在「User」中的數據。 – Lindow

1

更新:哦,這是非常不同的代碼,它看起來像你的實際的查詢是這樣的:

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() 
+0

已更新pdb的帖子 – Lindow

+0

謝謝,看看我上面的更新。但是從調試結果來看,您可以使用我的查詢使用seller_id&buyer_id來避免您報告的問題。 – 2ps

+0

仍然是同樣的問題 – Lindow

相關問題