2012-05-15 51 views
7

Tôi đang chơi với các mối quan hệ trong Django/python và tôi tự hỏi làm thế nào các bạn sẽ tạo ra một mối quan hệ giữa Người dùng và người theo dõi của mình và Người theo dõi cho người dùng mà anh ấy theo dõi.Người dùng theo dõi như twitter ở Django, bạn sẽ làm như thế nào?

Rất thích đọc ý kiến ​​của bạn ...

+1

Trừ khi bạn có câu hỏi liên quan đến lập trình cụ thể, điều này phù hợp hơn với tư cách là bài đăng trong diễn đàn. – patrickn

+0

@patrickn có lẽ là có nhưng nó cũng có thể được xem như một câu hỏi. Vì tôi không có đầu mối nên tôi bắt đầu hỏi về nó. –

Trả lời

19

Trước tiên, bạn nên hiểu cách store additional information about users. Nó đòi hỏi một mô hình khác có quan hệ với một người dùng, mô hình "hồ sơ".

Sau đó, bạn có thể sử dụng một trường M2M, giả sử bạn muốn sử dụng django-annoying, bạn có thể xác định mô hình hồ sơ người dùng của bạn như vậy:

from django.db import models 

from annoying.fields import AutoOneToOneField 

class UserProfile(models.Model): 
    user = AutoOneToOneField('auth.user') 
    follows = models.ManyToManyField('UserProfile', related_name='followed_by') 

    def __unicode__(self): 
     return self.user.username 

Và sử dụng nó như vậy:

In [1]: tim, c = User.objects.get_or_create(username='tim') 

In [2]: chris, c = User.objects.get_or_create(username='chris') 

In [3]: tim.userprofile.follows.add(chris.userprofile) # chris follows tim 

In [4]: tim.userprofile.follows.all() # list of userprofiles of users that tim follows 
Out[4]: [<UserProfile: chris>] 

In [5]: chris.userprofile.followed_by.all() # list of userprofiles of users that follow chris 
Out[5]: [<UserProfile: tim>] 

Ngoài ra, lưu ý rằng bạn có thể kiểm tra/sử dụng lại các ứng dụng như django-subscription, django-actstream, django-social (khó sử dụng hơn) ...

Y Bạn có thể muốn xem các gói django cho notificationsactivities vì tất cả chúng đều yêu cầu một số thiết kế cơ sở dữ liệu theo dõi/đăng ký.

+1

Tôi đã tạo UserProfile. Tôi nghĩ rằng một manytomanyfield là cách tôi nên đi. Nhưng trong dòng này chris.userprofile.followed_by.all() <- bạn đã định nghĩa hàm follow_by chưa? –

+0

Trên thực tế, follow_by là ** related_name ** của trường UserProfile.follows. Theo mặc định, nó sẽ là userprofile_set mà không thực sự mang tính thông tin. – jpic

+0

Ahh có bây giờ tôi thấy nhờ @jpic –

1

Chỉnh sửa: Làm cho cảm giác hơn để sử dụng ManyToManyField, như commenter gợi ý. Người dùng có thể có 0-x Người theo dõi người dùng và Người dùng có thể theo dõi 0-x Người dùng.

https://docs.djangoproject.com/en/1.3/ref/models/fields/#manytomanyfield

Không đi sâu vào mã, không cần nói nhiều.

+1

Một FK rất hữu ích cho một mối quan hệ 0: 1. Trong trường hợp bạn đang cố mô tả, người dùng có thể có 0: n người theo dõi và anh ấy có thể theo dõi người dùng 0: n. Do đó, quan hệ sẽ là n: m. – jpic

+0

Tôi đã sửa, quên khoảng 0 người theo dõi/0 người theo dõi. – patrickn

+1

Thay vào đó, 'nhiều người theo dõi' và 'nhiều người theo dõi', vì FK chỉ cho phép liên quan đến một người dùng. – jpic

2

Đây là cách tôi sẽ làm điều đó:

class Tweeter(models.Model): 
    user = models.ManyToManyField('self', symmetrical=False, through='Relationship') 

class Relationship(models.Model): 
    who = models.ForeignKey(Tweeter, related_name="who") 
    whom = models.ForeignKey(Tweeter, related_name="whom") 

Trong vỏ,

Trong [1]: t = Tweeter()

Trong [2]: t. save()

Trong [3]: f = Tweeter()

Trong [4]: ​​f.save()

Trong [5]: r = Mối quan hệ()

Trong [6]: r.who = t

Trong [7]: r.whom = f

Trong [8] : r.save()

Trong [18]: Relationship.objects.all() [0] .who.id
Out [18]: 1L

Trong [19]: Relationship.objects. tất cả() [0] .whom.id
Out [19]: 2L

Các vấn đề liên quan