2009-07-25 22 views
5

Tôi có một mô hình, bên dưới và tôi muốn nhận tất cả các giá trị area riêng biệt. SQL tương đương là select distinct area from tutorialsCách nhận giá trị khác biệt của một trong các mô hình của tôi trong Google App Engine

class Tutorials(db.Model): 
    path = db.StringProperty() 
    area = db.StringProperty() 
    sub_area = db.StringProperty() 
    title = db.StringProperty() 
    content = db.BlobProperty() 
    rating = db.RatingProperty() 
    publishedDate = db.DateTimeProperty() 
    published = db.BooleanProperty() 

Tôi biết rằng trong Python tôi có thể làm

a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com'] 
b = set(a) 
    b 
    >>> set(['livejournal.com', 'google.com', 'stackoverflow.com']) 

Nhưng điều đó sẽ yêu cầu tôi di chuyển các mục khu vực ra khỏi truy vấn vào một danh sách khác và sau đó chạy thiết lập chống lại danh sách (âm thanh rất kém hiệu quả) và nếu tôi có một mục riêng biệt ở vị trí 1001 trong kho dữ liệu, tôi sẽ không thấy nó vì giới hạn tìm nạp là 1000.

Tôi muốn nhận tất cả các giá trị khác biệt của khu vực trong kho dữ liệu của tôi đổ nó vào màn hình như l mực.

Trả lời

7

Lưu trữ dữ liệu không thể thực hiện việc này cho bạn trong một truy vấn. Một yêu cầu datastore luôn trả về một khối kết quả liên tiếp từ một chỉ mục và chỉ mục luôn bao gồm tất cả các thực thể của một loại đã cho, được sắp xếp theo bất kỳ thứ tự nào được chỉ định. Không có cách nào để truy vấn bỏ qua các mục chỉ vì một trường có giá trị trùng lặp.

Một tùy chọn là cơ cấu lại dữ liệu của bạn. Ví dụ, giới thiệu một loại thực thể mới đại diện cho một "khu vực". Khi thêm Hướng dẫn, bạn tạo "khu vực" tương ứng nếu nó chưa tồn tại và xóa một Tutoral xóa "khu vực" tương ứng nếu không có Hướng dẫn nào có cùng "khu vực". Nếu mỗi khu vực lưu trữ một số Hướng dẫn trong khu vực đó, điều này có thể không quá quan trọng (mặc dù việc giữ mọi thứ phù hợp với giao dịch v.v. thực sự sẽ khá khó). Tôi hy vọng rằng khóa của thực thể có thể dựa trên chuỗi khu vực, nghĩa là bạn luôn có thể thực hiện tra cứu chính thay vì truy vấn để nhận các thực thể khu vực.

Tùy chọn khác là sử dụng tác vụ xếp hàng hoặc công việc định kỳ để tạo danh sách tất cả các khu vực, tích lũy nó qua nhiều yêu cầu nếu cần, và đưa kết quả vào kho dữ liệu hoặc trong memcache. Tất nhiên điều đó có nghĩa là danh sách các khu vực có thể tạm thời lỗi thời (hoặc nếu có những thay đổi liên tục, nó có thể không bao giờ hoàn toàn trong ngày), có thể hoặc không thể chấp nhận được với bạn.

Cuối cùng, nếu có thể có rất ít khu vực so với hướng dẫn, bạn có thể làm điều đó một cách nhanh chóng bằng cách yêu cầu Hướng dẫn đầu tiên (được sắp xếp theo khu vực), sau đó yêu cầu Hướng dẫn đầu tiên có diện tích lớn hơn diện tích đầu tiên, v.v. Nhưng điều này đòi hỏi một yêu cầu cho mỗi khu vực riêng biệt, do đó, không có khả năng được nhanh chóng.

+0

Được rồi. Tôi muốn loại bỏ các "như xa như tôi biết" bit, cá nhân. :) –

+0

Cảm ơn câu trả lời của bạn. Tôi nghĩ tôi có thể làm ý tưởng tái cơ cấu. Tôi cũng đã hy vọng rằng có một số cách mơ hồ có thể làm điều đó – AutomatedTester

0

This has been asked before và kết luận là sử dụng bộ là tốt.

+0

Câu hỏi có cách sử dụng Python để lọc kết quả. Câu hỏi ở đây muốn giải thích cho trường hợp có từ 1001 Hướng dẫn trở lên và do đó một truy vấn không thể trả về chúng. –

1

Từ khóa DISTINCT đã được giới thiệu trong bản phát hành 1.7.4.

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