2012-05-22 90 views
2

我有這樣一個鏈接和書籤模式:鑑於我看看是否與給定的URL的鏈接已經存在內Django如何比較對象?

class Link(models.Model): 
    url = models.URLField(unique=True)   
    def __unicode__(self): 
     return self.url 

class Bookmark(models.Model): 
    title=models.CharField(max_length=200) 
    user=models.ForeignKey(User) 
    link=models.ForeignKey(Link)   
    def __unicode__(self): 
     return u'%s, %s' % (self.user.username, self.link.url) 

現在。 然後將該對象與用戶名傳遞給Bookmarks集合,以查看書籤是否已經存在,並且該用戶名已存在並且鏈接實例已存在。

def bookmark_save_page(request): 
    if request.method == 'POST': 
     form = BookmarkSaveForm(request.POST) 
     if form.is_valid(): 
      # Create or get Link 
      link, dummy = Link.objects.get_or_create(url=form.cleaned_data['url']) 
      # Create or get bookmark 
      bookmark, created = Bookmark.objects.get_or_create(user=request.user, link=link) 

      # Save bookmark to database 
      bookmark.save() 
      return HttpResponseRedirect('/user/%s/' % request.user.username) 

這是我不明白的一點。它如何知道如何將鏈接模型中的url字段作爲比較方式?是否因爲我已經像這樣在Link模型中定義了它?

def __unicode__(self): 
     return self.url 

我從.NET來了,有你有定義GetHash()爲類,以此來說明如何實例應該相互作比較。

Python如何知道這一點? 謝謝

+0

你甚至可以在對象之間進行比較?你唯一的比較運算符是'request.method =='POST',它比較2個字符串。 – geoffspear

+0

哪一行比較對象? – bcoughlan

+3

['__cmp__()'](http://docs.python.org/reference/datamodel.html#object.__cmp__),['__eq__()'](http://docs.python.org/reference/ datamodel.html#object .__ eq__),['__gt__()'](http://docs.python.org/reference/datamodel.html#object.__gt__),['__lt__()'](http:// docs.python.org/reference/datamodel.html#object.__lt__)等... –

回答

5

我想你問的是「過濾時如何比較實例」,而不是「如何做python比較對象」。

隨着下面的代碼行,

bookmark, created = Bookmark.objects.get_or_create(user=request.user, link=link) 

Django是過濾鏈路對象的主鍵。 __unicode__方法並不重要。

欲瞭解更多信息,請參閱Django文檔comparing objectsqueries over related objects

+0

就是這樣。謝謝。在Link類中,url是主鍵,因爲它的唯一性是正確的?書籤類怎麼樣?無論如何,標題不是唯一的,其他兩個都是外鍵。如何知道哪個字段是主鍵? – Houman

+2

除非您手動指定主鍵(您沒有在這裏完成),Django會自動生成一個主鍵。有關[自動主鍵字段]的文檔(https://docs.djangoproject.com/en/dev/topics/db/models/#automatic-primary-key-fields)以獲取更多信息。 – Alasdair

+1

換句話說,這些字段都不是主鍵 - 「id」字段是自動的。 –