2011-10-25 18 views
6

tôi thấy hai cách triển khai một đối xứng hệ thống hữu nghị (bạn là bạn của tôi, vì vậy tôi cũng là bạn của bạn) trong Django:Bạn bè Django là trường nhiều người - lưu trữ tốt hơn người dùng hoặc UserProfile (tự) trong trường?

Như đã đề cập trong các tài liệu:

class UserProfile(models.Model): 
    friends = models.ManyToManyField(User, related_name='friends') 

Bây giờ, tôi 'muốn để có được tất cả các mô hình sử dụng VÀ userprofile 'thân thiện' với một select_related truy vấn như vậy (mà phải là một nghịch tham gia tra cứu):

profiles = UserProfile.objects.filter(user__in=request.user.get_profile().friends.all()).select_related() 

tôi truy vấn userprofile, bởi vì thứ theo cách này, tôi có thể sử dụng select_related() và tất cả các đối tượng liên quan được lưu trữ.

Mặt khác, tôi có thể xác định mô hình của tôi tham khảo lĩnh vực bạn bè để "tự", như vậy:

class UserProfile(models.Model): 
    friends = models.ManyToManyField('self') 

Bây giờ, bạn tra cứu select_related của tôi trông như thế:

profiles = this_user.get_profile().friends.all().select_related() 

Tôi luôn luôn cần cả hai, đối tượng người dùng và hồ sơ liên quan của nó: Cách tiếp cận thứ hai là đơn giản hơn nhiều liên quan đến tra cứu đảo ngược thông qua select_related(), nhưng thực tế như nhau. Tuy nhiên, bằng cách sử dụng "tự" như tham chiếu trường, Django xử lý cho tôi tình bạn đối xứng. Do đó, tôi không phải tạo hai mục nhập cho mỗi tình bạn trong cơ sở dữ liệu theo cách thủ công. Django làm điều đó cho tôi. Tuy nhiên, tùy chọn đối xứng chỉ hoạt động trên các trường tham chiếu "tự".

Giải pháp nào tốt hơn? Tôi không thể tìm thấy bất cứ điều gì về nó. Bất kỳ ý tưởng đánh giá cao - cảm ơn!

Trả lời

3

Simon,

Đôi khi tốt hơn nên sử dụng plugin hiện tại, thay vì cố gắng phát minh lại bánh xe.

Bạn đã xem django-friends chưa?

+2

Hmm, yepp, tôi biết điều đó, cảm ơn; cũng django-đơn giản-bạn bè ([link] (https://github.com/muhuk/django-simple-friends)), tuy nhiên nó không phải là nhiều công việc để thực hiện tính năng này và tôi biết chính xác những gì đang xảy ra. Cả hai gói đều khá rộng rãi về các tính năng và tài liệu về cách sử dụng chúng rất mỏng. Ngoài ra cả hai ứng dụng tạo ra các mô hình bổ sung - trong lợi của sự đơn giản, tôi thay vì sử dụng ** một ** nhiều-nhiều lĩnh vực và để cho Django xử lý phần còn lại. –

+0

+1 cho django-simple-friends –