2013-07-09 32 views
5

Tôi đã di chuyển sang mô hình người dùng tùy chỉnh Django (CustomUser) mà một số mô hình khác có quan hệ khóa ngoài và M2M. CustomUser cũng được phân loại bởi mô hình tác giả của Zinnia (Tác giả) - Zinnia là một ứng dụng viết blog tuyệt vời của bên thứ ba.Mô hình người dùng tùy chỉnh Django được phân loại (bởi Zinnia)

Vấn đề của tôi là khi tôi truy cập CustomUser qua một mối quan hệ, ví dụ: OtherModel.customuser nó trả về một thể hiện của CustomUser, nhưng trong quan điểm của tôi khi tôi truy cập request.User nó là một thể hiện của tác giả. Vì các thuộc tính của Author và CustomUser giống hệt nhau nên nói chung không tạo ra nhiều khác biệt nhưng nếu tôi muốn kiểm tra sự tương đương của các đối tượng người dùng trong Views của tôi, tôi phải sử dụng request.user.id chứ không phải request.user và bản năng don ' Tôi thích sự mơ hồ mà tôi đang xử lý.

Có thể tôi tốt hơn khi vượt qua nó và để lại mọi thứ vì chúng hoạt động sau khi một vài thay đổi nhỏ trong quan điểm của tôi. Tuy nhiên, trong một thế giới hoàn hảo, tôi sẽ đề cập nhất quán đến cùng một mô hình Người dùng nhưng tôi không chắc chắn cách tốt nhất để tiến bộ. Bất kỳ ý tưởng?

settings.py

AUTH_USER_MODEL = 'profiles.CustomUser' 

models.py (trong ứng dụng hồ sơ)

class CustomUser(AbstractUser): 

    visits = models.PositiveIntegerField(
     _('visits'), 
     default=0, 
     blank=True 
    ) 

    def __unicode__(self): 
     return self.username 

class OtherModel(models.Model): 

    author = models.ForeignKey(CustomUser) 

Tôi biết các khuyến nghị trong documentation là làm cho mối quan hệ với settings.AUTH_USER_MODEL hơn là trực tiếp với mô hình người dùng tùy chỉnh. Tôi dự định sẽ thay đổi điều đó, nhưng muốn hiểu những gì tôi đang làm trước khi tung ra một lần nữa vào nỗi đau của một di dân

author.py (trong ứng dụng giống cây bách nhựt)

from django.contrib.auth import get_user_model 


@python_2_unicode_compatible 
class Author(get_user_model()): 
    """ 
    Proxy model around :class:`django.contrib.auth.models.get_user_model`. 
    """ 

    objects = get_user_model()._default_manager 
    published = EntryRelatedPublishedManager() 

Trong giao diện điều khiển get_user_model() trả về các cấu hình .models.CustomUser class

+1

Tôi có cùng vấn đề. Bạn đã tìm thấy một giải pháp? – Blaise

Trả lời

0

Tôi nghĩ rằng tôi gặp vấn đề của bạn.

Theo mặc định, Django không bỏ qua các phiên bản mô hình. Ví dụ, lấy ví dụ sau đây:

from django.db import models 

class Parent(models.Model): 
    name = models.CharField() 

class Child(Parent): 
    pass 

Parent(name="parent").save() 
Child(name="child").save() 

Parent.objects.all() # will return Parent instances 
Child.objects.all() # will return Child instances 

Trong trường hợp của bạn, tốt, bạn có giống cây bách nhựt làm việc với Author trường hợp, và phần còn lại của dự án của bạn với CustomUser dụ. Vì vậy, về cơ bản bạn có thể downcast mỗi cá thể CustomUser. Bạn có thể đạt được điều này bằng cách sử dụng một ứng dụng django hiện có, chẳng hạn như django-polymorphic (theo ý kiến ​​của tôi, là phải có khi làm việc với thừa kế cụ thể). Tuy nhiên, nếu tất cả người dùng của bạn không phải là tác giả, bạn đang hơi say

Bạn cũng có thể thỏa hiệp, và thực hiện một sự liệng lên thủ công như sau:

from django.contrib.auth import get_user_model 

class CustomUser(AbstractUser): 

    # your logic... 

    def as_custom_user(self): 
     return super(get_user_model(), self) 

Cách sử dụng:

assert request.user.as_custom_user() == article.author.as_custom_user() 
Các vấn đề liên quan