2011-10-27 28 views
8

Tôi muốn xác định một mô hình proxy cho lớp mặc định tài khoản của Django, một cái gì đó loại như thế này:Truyền từ mô hình cơ bản đến mô hình proxy có nguồn gốc ở Django?

class MyUser(User): 

    def pretty_username(self): 
     if self.first_name: 
      return self.first_name 
     return self.username 

    class Meta: 
     proxy = True 

Và, tôi muốn để có thể gọi pretty_username khỏi tầm nhìn mã (và lý tưởng, thậm chí từ mẫu). Có cách nào đơn giản để lấy một cá thể của một Mô hình người dùng chuẩn và nhập nó vào một cá thể của MyUser?

Thậm chí một số __init__ kỳ diệu sẽ ổn với tôi, miễn là tôi có thể nói:

my_user = MyUser(request.user) 

trong mã quan điểm của tôi.

+1

Có vẻ như bạn đang cố gắng để thực hiện một wrapper hoặc bộ chuyển đổi cho lớp User. Sẽ có một cái gì đó như thế này: http://ginstrom.com/scribbles/2009/03/27/the-adapter-pattern-in-python/ làm các thủ thuật? – mbrenig

Trả lời

4

Nếu bạn thực sự muốn có đối tượng proxy đầy đủ có sẵn, đây là một giải pháp nhanh chóng và dơ bẩn (tại các chi phí của một cuộc gọi cơ sở dữ liệu phụ)

class MyUser(User): 

    def pretty_username(self): 
     if self.first_name: 
      return self.first_name 
     return self.username 

    class Meta: 
     proxy = True 


def get_myuser(self): 
    try: 
     return MyUser.objects.get(pk=self.pk) 
    except MyUser.DoesNotExist: 
     return None 

User.add_to_class('get_myuser', get_myuser) 

Vì vậy, để sử dụng này trong một lần xem bạn có thể nói :

request.user.get_myuser().pretty_username() 

Hoặc trong một khuôn mẫu:

{{ request.user.get_myuser.pretty_username }} 

một giải pháp đẹp hơn, nếu bạn không gắn với ý tưởng mô hình proxy, sẽ là như sau:

def pretty_username(self): 
    if self.first_name: 
     return self.first_name 
    return self.username 

User.add_to_class('pretty_username', pretty_username) 

này sẽ cho phép như sau:

request.user.pretty_username() 

Hoặc

{{ request.user.pretty_username }} 
+10

Phương thức get_myuser phải thay đổi kiểu đối tượng người dùng từ Người dùng thành MyUser. Điều này có thể được thực hiện bằng cách sử dụng thuộc tính '__class__':' def get_myuser (self): self .__ class__ = MyUser' mà không có một cuộc gọi cơ sở dữ liệu bổ sung – fhahn

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