2017-06-21 16 views
5

Mô hình của tôi giống như thế này.Thứ tự Django_by trên trường json lồng nhau

class Foo(): 
    bar = models.ForeignKey('Bar', related_name='bar') 
    payload = JSONField() 

class Bar(): 
    candy = models.ForeignKey('Candy', related_name='candy') 

class Candy(): 
    payload = JSONField() 

queryset tôi trông giống như thế này

# I want to order by a name on the json field 
queryset = [ 
{ 
    "id": 1, 
    "payload": {"age": 10, "company": "ccc"} 
    "bar": 
    { 
    'id': 1, 
     "candy": 
     { 
     "payload": 
      { 
      "names": ["text":"abc", "tag":"foo"], ["text":"abb", "tag":"bar"] 
      } 
     } 
    } 
}, 
{ 
    "id": 2, 
    "payload": {"age": 12, "company": "aa"} 
    "bar": 
    { 
    'id': 2, 
     "candy": 
     { 
     "payload": 
      { 
      "names": ["text":"aaa", "tag":"bar"], ["text":"bbb", "tag":"bart"] 
      } 
     } 
    } 
}] 


foo = Foo.objects.all() #now I want to order foo by "names.text" 

Đây là những gì tôi đã cố gắng cho đến nay

foo = foo.order_by(RawSQL("payload->>%s", ("age",))) #this works!! 
foo = foo.order_by(RawSQL("bar.candy.payload->>%s", ("names[0].text",))) #does not work 

Những tuyên bố thứ hai không hoạt động. Tôi lấy cảm hứng để sử dụng RawSQL từ đây Django 1.9 JSONField order_by

Tôi không thể tìm ra cách điều hướng đến lớp cụ thể đó và sau đó thực hiện truy vấn. Cách tốt nhất để làm việc này là gì?

Trả lời

0

nếu bạn sử dụng nội dung đã nhập RawSQL phải là truy vấn sql. truy vấn đã nhập chỉ chọn các đối tượng mô hình Foo.

trước tiên bạn phải chọn nội dung mô hình có liên quan.

foo = Foo.objects.select_related("bar__candy") 

trong vỏ python nếu bạn nhập

print foo.query 

bạn có thể thấy truy vấn cơ sở dữ liệu đã nhập và tất cả các lĩnh vực tên

sau đó bạn phải nhập RawSQL với chọn tên trường vào.

nếu bạn nhìn thấy trong truy vấn tất cả các tên trường là ở định dạng

"<table name>"."<field name>" 

nếu tên ứng dụng của bạn là chính tên bảng kẹo của bạn trong cơ sở dữ liệu là main_candy vì vậy bạn có thể nhập RawSQL:

foo = foo.order_by(RawSQL("main_candy.payload->>%s", ("names[0].text",))) 

và nó phải hoạt động.

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