2012-10-05 6 views
5

Có thể bao gồm các trường trên các mô hình liên quan, sử dụng chế độ ăn ngon không? Theo các mô hình của tôi dưới đây: nếu tôi duy trì một VideoContent và một TextContent instance cho DB, tôi có thể lấy 2 đối tượng trở lại từ tài nguyên Nội dung của tôi, tuy nhiên không có trường bổ sung nào có sẵn.Tastypie truy cập các trường từ mô hình được kế thừa

Có thể bao gồm các trường từ mô hình liên quan (trong trường hợp này, url video và nội dung văn bản) và điều đó sẽ bổ sung thêm nhiều loại nội dung trong tương lai mà không phải viết lại tài nguyên nội dung điều này theo hướng sai?

Mục đích là để có thể mở rộng này với nhiều ContentTypes mà không cần phải thay đổi các nguồn nội dung (giả sử nó có thể để có được nó làm việc ở nơi đầu tiên)

Models.py:

class Content(models.Model): 
    parent = models.ForeignKey('Content', related_name='children', null=True, blank=True) 

class TextContent(Content): 
    text = models.CharField(max_length=100) 

class VideoContent(Content): 
    url = models.CharField(max_length=1000) 

Và sau đó nguồn lực của tôi:

class ContentResource(ModelResource): 
    children = fields.ToManyField('myapp.api.resources.ContentResource', 'children', null=True, full=True) 

    class Meta: 
     resource_name = 'content' 
     queryset = ContentResource.objects.all() 
     authorization = Authorization() 
     always_return_data = True 

Trả lời

2

tôi tìm thấy một giải pháp tốt trong câu trả lời khác

Populating a tastypie resource for a multi-table inheritance Django model


tôi đã chạy vào cùng một vấn đề - mặc dù tôi vẫn còn ở giữa giải quyết nó. Hai điều tôi đã tìm ra cho đến nay:

django-model-utils cung cấp trình quản lý kế thừa cho phép bạn sử dụng lớp cơ sở trừu tượng để truy vấn bảng và có thể tự động downcast kết quả truy vấn.

Một điều cần xem xét là các phương thức dehydrate/rehydrate có sẵn cho các lớp Tài nguyên.

Đây là những gì tôi đã làm:

class CommandResource(ModelResource): 

    class Meta: 
     queryset = Command.objects.select_subclasses().all() 

Đó chỉ giúp bạn nửa đường - tài nguyên cũng phải bao gồm mất nước/rehydrate thứ bởi vì bạn phải tay gói đối tượng lên để truyền (hoặc recieving) từ người dùng. Điều tôi đang nhận ra bây giờ là đây là siêu hacky và có phải là một cách tốt hơn/sạch hơn được cung cấp bởi ngon - họ không thể mong đợi bạn phải làm điều này loại đóng gói bằng tay trong các loại tình huống - nhưng, có thể họ làm. Tôi đã chỉ có khoảng 8 giờ kinh nghiệm với tastypie @ điểm này vì vậy nếu tôi giải thích điều này tất cả sai có lẽ một số người sử dụng stackoverflow tốt đẹp có thể đặt tôi thẳng. : D: D: D

0

Tôi có cùng yêu cầu và cuối cùng đã giải quyết được.

Tôi không thích câu trả lời được đưa ra trong liên kết ở trên vì tôi không thích ý tưởng kết hợp queryset và sắp xếp lại.

Rõ ràng, bạn có thể kế thừa nhiều tài nguyên.

Bằng cách phân lớp nhiều tài nguyên, bạn bao gồm các trường tài nguyên.
Và vì các trường đó là duy nhất đối với mỗi tài nguyên, tôi đã tạo chúng trong giá trị init.

tự hỏi liệu có cách nào chỉ liệt kê phụ huynh một lần không. (Có hai giờ. Một cho phân lớp và một trong meta)

class SudaThreadResource(ThreadResource): 

    def __init__(self, *args, **kwargs): 
     super(SudaThreadResource, self).__init__(*args, **kwargs) 

     for field_name, field_object in self.fields.items(): 
      # inherited_fields can be null                                                          
      if field_name in self.Meta.inherited_fields: 
       field_object.null=True 

    class Meta(ThreadResource.Meta): 
     resource_name = 'thread_suda' 
     usedgoodthread_fields = UsedgoodThreadResource.Meta.fields[:] 
     userdiscountinfothread_fields = UserDiscountinfoThreadResource.Meta.fields[:] 
     staffdiscountinfothread_fields = StaffDiscountinfoThreadResource.Meta.fields[:] 
     bitem_checklistthread_fields = BitemChecklistThreadResource.Meta.fields[:] 

     parent_field_set = set(ThreadResource.Meta.fields[:]) 

     field_set = set(
      set(usedgoodthread_fields) | 
      set(userdiscountinfothread_fields) | 
      set(staffdiscountinfothread_fields) | 
      set(bitem_checklistthread_fields) 
     ) 

     fields = list(field_set) 
     inherited_fields = list(field_set - parent_field_set) 


     queryset = forum_models.Thread.objects.not_deleted().exclude(
      thread_type__in=(forum_const.THREAD_TYPE_MOMSDIARY, forum_const.THREAD_TYPE_SOCIAL_DISCOUNTINFO) 
     ).select_subclasses()