2012-09-15 25 views
6

Làm cách nào để kết hợp nhiều Tài nguyên trong TastyPie? Tôi có 3 mô hình tôi muốn kết hợp: người dùng, tiểu sử và bài đăng.Kết hợp các nguồn lực liên quan với TastyPie

Lý tưởng nhất là tôi muốn các hồ sơ được lồng trong người dùng. Tôi muốn hiển thị cả người dùng và tất cả vị trí hồ sơ từ UserPostResource. Tôi không chắc phải đi đâu từ đây.

class UserResource(ModelResource): 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     fields = ['username','id','date_joined'] 

     #Improper Auth 
     authorization = Authorization() 

class UserProfileResource(ModelResource): 

    class Meta: 
     queryset = UserProfile.objects.all() 
     resource_name = 'profile' 


class UserPostResource(ModelResource): 
    user = fields.ForeignKey(UserResource,'user', full=True) 


    class Meta: 
     queryset = UserPost.objects.all() 
     resource_name = 'userpost' 

     #Improper Auth 
     authorization = Authorization() 

Dưới đây là mô hình của tôi:

class UserProfile(models.Model): 

    user = models.OneToOneField(User) 

    website = models.CharField(max_length=50) 
    description = models.CharField(max_length=255) 
    full_name = models.CharField(max_length=50) 


class UserPost(models.Model): 
    user = models.ForeignKey(User) 

    datetime = models.DateTimeField(auto_now_add=True) 
    text = models.CharField(max_length=255, blank=True) 
    location = models.CharField(max_length=255, blank= True) 

Trả lời

10

lĩnh vực Tastypie (khi tài nguyên là một ModelResource) cho phép đi qua trong attribute kwarg, do đó chấp nhận django thường xuyên cú pháp tra cứu lồng nhau.

Vì vậy, trước hết là tất cả điều này có thể có ích:

# in UserProfile model (adding related_name) 
user = models.OneToOneField(User, related_name="profile") 

và đưa ra các thay đổi trên, như sau:

from tastypie import fields 

class UserResource(ModelResource): 
    # ... 
    website = fields.CharField(attribute = 'profile__website') 
    description = fields.CharField(attribute = 'profile__description') 
    full_name = fields.CharField(attribute = 'profile__full_name') 
    # ... 

sẽ phơi bày dữ liệu từ UserProfile mô hình trong UserResource.

Bây giờ, nếu bạn muốn hiển thị danh sách các địa điểm (đến từ UserPost) trong số UserResource, bạn sẽ phải ghi đè một trong các phương thức Tastypie. Theo tài liệu, một ứng cử viên tốt sẽ là phương pháp dehydrate().

Something như thế này nên làm việc:

# in UserPost model (adding related_name) 
user = models.ForeignKey(User, related_name="posts") 

class UserResource(ModelResource): 
    # .... 
    def dehydrate(self, bundle): 
     posts = bundle.obj.posts.all() 
     bundle.data['locations'] = [post.location for post in posts] 
     return bundle 
    # ... 
+0

UserProfile có liên quan đến người dùng và UserPost có liên quan đến tài khoản, bạn có thể cung cấp một ví dụ trong trường hợp này? – arooo

+1

Nếu bạn có thể dán các mô hình của mình và nói những thuộc tính nào của mô hình nào bạn muốn hiển thị thông qua 'UserResource' thì có. – kgr

+0

Tôi đã cập nhật câu hỏi của mình – arooo

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