2014-02-07 14 views
0
user_id user_follow 
3    2 
3    2 
3    2 
2    3 

登錄user id=3,現在我想跟着我誰的人,我跟隨在登錄用戶Django框架他們,相互跟蹤。以上senario顯示登錄user(id=3)按照user(id=2)user(id=2)也按照登錄user(id=3)現在我想顯示登錄用戶,有多少用戶關注你,你跟着他。使用django ormDjango的ORM相互後續查詢

class Cause(models.Model): 
    description = models.TextField() 
    start_date = models.DateTimeField(null=True, blank=True) 
    creation_date = models.DateTimeField(default=datetime.now) 
    creator = models.ForeignKey(User, related_name='cause_creator_set') 
    attendees = models.ManyToManyField(User) 


class Attendance(models.Model): 

    user = models.ForeignKey(User) 
    cause = models.ForeignKey(Cause) 
    user_follow = models.IntegerField(max_length=255) 
    registration_date = models.DateTimeField(default=datetime.now) 
    follow = models.BooleanField(default=False) 

    def __unicode__(self): 
     return "%s is attending %s" % (self.user.username, self.event) 

    class Meta(object): 
     verbose_name_plural = "Attendance" 
+0

你問如何使用通過ORM一個多對多的關係? – yuvi

+0

是的。但給上述senario的查詢集。我如何得到mutuall跟隨用戶名,並顯示他們登錄用戶,這些人跟着你,你跟着他們 – user3070411

+0

上述情況沒有什麼特別的(除了不明原因的重複),但我確定我會給你一個解釋(如果沒有一個擊敗了我) – yuvi

回答

0

這裏有很多問題,我會嘗試解決它們。

  1. 您的模型描述的關係是Extra field on ManyToMany relationship。簡而言之,Cause有一個ManyToMany給用戶,參加者是一個intermediatry表格。使用through指令的好處主要是爲了便於訪問,您可以閱讀我鏈接的示例文檔。所以:

    attendees = models.ManyToManyField(User, through='Attendance') 
    
  2. 現在讓我們來談談考勤。我有兩個字段的問題:

    user = models.ForeignKey(User) 
    user_follow = models.IntegerField(max_length=255) 
    follow = models.BooleanField(default=False) 
    

    是的,我展示了3個,因爲其中只有2個是有問題的。所以你有一個ForeignKey到用戶,對吧?但是什麼一個ForeignKey?它只是一個IntegerField,指向不同表上的行(pk)。還有其他的東西發生在這裏,但基本的東西是它只是一個整數域。然後你想再次將該模型鏈接到用戶,對嗎?因此,而不是添加另一個ForeignKey,您使用一個IntegerField

    你明白爲什麼這是壞事嗎?我會解釋 - 你不能在你自己的邏輯上使用ORM。現在我假設你正試圖在這裏完成基本的東西其實是這樣的:

    # let's pretend that User isn't built-in 
    class User(models.Model): 
        follow = models.ManyToManyField('self') 
    

    然後有follow布爾,我真的不明白 - 如果用戶連接到另外一個,不那自動錶示他在跟蹤他?似乎更像是一種方法而不是任何事情

    ,無論如何,我能想到的兩個非常有效的選項:

    • 使用另一個ForeignKey的。真的,如果這是有道理的,多個ForeignKeys沒有任何問題。實際上,它將創建一種從用戶到他自己的ManyToMany作爲中介表。我認爲這是有道理的

    • 創建您自己的用戶類。 Not a terribly complicate feat。我也推薦這個,因爲你似乎有很多定製。內置用戶非常棒,因爲它非常適合開箱即用。但與此同時,內置的用戶基本上都是圍繞管理界面構建的,並且有很多限制。一個自定義的會更容易。然後你可以做recursive relationship這似乎是你正在尋找,然後植入is_following作爲布爾方法(似乎更合適)。

  3. 我要做的最後一件事就是向你展示你正在尋找的方法。我正在向您展示如何執行此操作,但我強烈建議您先採納我的建議並構建您自己的用戶模型。當然,這種方法看起來不同,但轉換並不困難。

    這就是說,這裏的關鍵是簡單地創建兩種方法 - 一種用於檢查用戶是否相關。第二個用於檢查你是否被他跟蹤。所以,如果我理解正確的話,你想實現:

    #using your way 
        def follows(a, b): 
         if Attendence.objects.filter(user__pk=a, user_follow=b).count() > 0: 
          return True 
         return False 
    
        def mutual(a, b): 
         if follows(a, b) and follows(b, a): 
          return True 
         return False 
    
        a, b = 2, 3 
        mutual(2, 3) # will output True 
    
    
        #using a custom User Class: 
        class MyUser(AbstractBaseUser): 
         # required fields here... 
         follow = models.ManyToManyField('self') 
    
         def is_following(self, user): 
          if user in self.follow.all(): 
           return True 
          return False  
    
         def mutual(self, user): 
          if self.is_following(user) and user.is_following(self): 
           return True 
          return False