mongoengine Django

19832 단어 PythonDjango
데이터베이스 조회Document 대상은 데이터베이스에서 이 클래스와 관련된 대상에 접근하는 데 사용되는 objects 속성이 있다.이 objects 속성은 사실 QuerySetManager 이고, 새로운 QuerySet 대상의 방문을 만들고 되돌려줍니다.이 QuerySet 객체는 데이터베이스에서 검색할 수 있는 문서입니다.
# Prints out the names of all the users in the database
for user in User.objects:
    print user.name

질의 필터링QuerySet 대상의 키 파라미터를 호출하여 데이터 조회를 필터할 수 있습니다. 키 조회의 키는 당신이 조회하고자 하는 Document의 필드와 일치합니다.
# This will return a QuerySet that will only iterate over users whose
# 'country' field is set to 'uk'
uk_users = User.objects(country='uk')

문서가 포함된 필드는 객체 속성 액세스 구문의 __ 대신 .를 사용하여 액세스할 수 있습니다.
# This will return a QuerySet that will only iterate over pages that have
# been written by a user whose 'country' field is set to 'uk'
uk_pages = Page.objects(author__country='uk')

조회 조작부호
또한 질의에서 키워드의 이중 밑줄에 연산자를 추가하면 됩니다.
# Only find users whose age is 18 or less
young_users = Users.objects(age__lte=18)

사용 가능한 연산자는 다음과 같습니다.
  • ne–같지 않다
  • lt – 작음<
  • lte – 같음
  • 보다 작음
  • gt – 크게>
  • gte – 같음
  • 보다 크다
  • not - 하나의 표준을 부정하는 검사는 다른 조작부호 앞에 사용해야 한다(e.g.Q(age__not__mod=5))
  • inlist 에서
  • nin – 값이 없음list
  • modvalue % x == y, 여기서 xy는 주어진 값
  • 이다.
  • alllist안의 모든 값
  • size - 배열의 크기
  • exists – 이 값이 있음
  • 문자열 조회
    다음 조작부호는 정규 조회를 신속하게 진행할 수 있다.
  • exact - 문자열 필드가 이 값과 완전히 일치
  • iexact - 문자열 필드가 이 값과 완전히 일치합니다(대소문자 민감)
  • contains - 문자열 필드에 이 값이 포함됩니다
  • icontains - 문자열 필드에 이 값(대소문자 민감)
  • 이 포함됩니다.
  • startswith - 문자열 필드는 이 값으로 시작합니다
  • .
  • istartswith - 문자열 필드는 이 값으로 시작합니다(대소문자 민감)
  • .
  • endswith - 문자열 필드는 이 값으로 끝납니다
  • iendswith - 문자열 필드는 이 값으로 끝납니다(대소문자 민감)
  • match - $elemMatch 조작을 실행하기 때문에 하나의 그룹에 있는document 실례를 사용할 수 있습니다
  • 지리 조회
    PASS
    목록 조회
    대부분의 필드에 대해 이 문법은 그 필드가 제시한 값과 일치하는 문서를 조회하지만, 한 필드가 인용ListField할 때 하나의 데이터만 제공하면 이 데이터를 포함하는 것은 일치한다.
    class Page(Document):
        tags = ListField(StringField())
    
    # This will match all pages that have the word 'coding' as an item in the
    # 'tags' list
    Page.objects(tags='coding')

    원본 질의__raw__ 매개 변수를 통해 원시적PyMongo 문장을 사용하여 조회할 수 있습니다. 이렇게 하면 원시적인 완전한 조회를 할 수 있습니다.
    Page.objects(__raw__={'tags''coding'})

    결과 제한 및 건너뛰기
    전통적인 ORM처럼 되돌아오는 결과의 수량을 제한하거나 일정 수량의 결과를 뛰어넘어야 할 때가 있다.QuerySet에는 limit()skip() 두 가지 방법으로 실현할 수 있지만 수조 절단의 문법을 사용하는 것을 추천합니다.
    # Only the first 5 people
    users = User.objects[:5]
    
    # All except for the first 5 people
    users = User.objects[5:]
    
    # 5 users, starting from the 11th user found
    users = User.objects[10:15]

    너는 조회가 결과를 되돌릴 수 있도록 지정할 수 있다.만약 이 항목이 데이터베이스에 존재하지 않는다면 IndexError 오류를 일으킬 수 있습니다.first() 방법을 사용하면 데이터가 존재하지 않을 때 되돌아온다None:
    >>> # Make sure there are no users
    >>> User.drop_collection()
    >>> User.objects[0]
    IndexError: list index out of range
    >>> User.objects.first() == None
    True
    >>> User(name='Test User').save()
    >>> User.objects[0] == User.objects.first()
    True

    기본값Document 쿼리
    기본적으로, Documentobjects 속성은 하나의 QuerySet 대상을 되돌려줍니다. 모든 데이터 대상을 되돌려줍니다.이 점은 document에 방법을 정의해서 수정할 수 있다queryset.이 방법은 두 개의 매개 변수__doc_clsqueryset가 필요하다.첫 번째 파라미터는 이 방법을 정의하는 Document 클래스(이런 의미에서 보면 이 방법은 일반적인 방법이 아닌 classmethod()와 같고 두 번째 파라미터는 초기화된 것이다queryset.이 방법은 그것을 장식하기 위해 queryset_manager()를 사용해야 인정받을 수 있다.
    class BlogPost(Document):
        title = StringField()
        date = DateTimeField()
    
        @queryset_manager
        def objects(doc_cls, queryset):
            # This may actually also be done by defining a default ordering for
            # the document, but this illustrates the use of manager methods
            return queryset.order_by('-date')
    objects 방법을 사용하지 않아도 됩니다. 예를 들어 다음과 같은 관리 방법을 사용자 정의할 수 있습니다.
    class BlogPost(Document):
        title = StringField()
        published = BooleanField()
    
        @queryset_manager
        def live_posts(doc_cls, queryset):
            return queryset.filter(published=True)
    
    BlogPost(title='test1', published=False).save()
    BlogPost(title='test2', published=True).save()
    assert len(BlogPost.objects) == 2
    assert len(BlogPost.live_posts()) == 1

    사용자 정의QuerySets
    네가 스스로 방법을 정의해서 필터를 하고 싶을 때 document, 계승 QuerySet 종류는 너에게 좋은 방법이다.document 에서 사용자 정의 QuerySet 클래스를 사용하기 위해서 documentmeta 사전에 queryset_class 값을 설정해서 그것을 실현할 수 있습니다.
    class AwesomerQuerySet(QuerySet):
    
        def get_awesome(self):
            return self.filter(awesome=True)
    
    class Page(Document):
        meta = {'queryset_class': AwesomerQuerySet}
    
    # To call:
    Page.objects.get_awesome()

    Aggregation 집선
    MongoDB는 상자를 열면 바로 사용할 수 있는 집합 방법을 제공했지만 RDBMS가 제공하는 것만큼 많지 않았다.MongoEngine은 포장된 내장된 방법을 제공하는 동시에 자체적으로 몇 가지 방법을 제공하여 데이터베이스 서비스에서 실행되는Javascript 코드의 기능을 실현했다.
    결과 수
    제한과 건너뛰기 결과처럼 QuerySet 대상은 계수하는 방법을 제공했다-count(). 그러나 더 Pythonic 방법은 다음과 같다.
    num_users = len(User.objects)

    다양한 기능document의 특정 필드의 수량을 계산하고 싶을 때sum():
    yearly_expense = Employee.objects.sum('salary')

    한 필드의 평균을 구하려면 average():
    mean_age = User.objects.average('age')

    MongoEngine은 집합에 있는 주파수 item 를 가져오는 방법을 제공했다.다음 예에서는 item_frequencies()를 생성할 수 있습니다.
    class Article(Document):
        tag = ListField(StringField())
    
    # After adding some tagged articles...
    tag_freqs = Article.objects.item_frequencies('tag', normalize=True)
    
    from operator import itemgetter
    top_tags = sorted(tag_freqs.items(), key=itemgetter(1), reverse=True)[:10]

    쿼리 효율성 및 성능
    PASS
    고급 질의
    때때로 키워드 파라미터를 사용하여 되돌아오는 tag-clouds 은 당신의 조회 수요를 완전히 만족시킬 수 없습니다.예를 들어 제약 조건QuerySet,and의 조작을 해야 할 때가 있다.MongoEngine에서 제공하는 or 클래스를 사용하면 됩니다. 하나의 Q 클래스는 하나의 검색의 일부분을 대표하며, 그 안의 매개 변수 설정은 당신이 검색한 Q 때와 같습니다.복잡한 조회를 만들 때 document 또는 & 조작부호로 | 대상을 연결해야 한다.예를 들면 다음과 같습니다.
    from mongoengine.queryset.visitor import Q
    
    # Get published posts
    Post.objects(Q(published=True) | Q(publish_date__lte=datetime.now()))
    
    # Get top posts
    Post.objects((Q(featured=True) & Q(hits__gte=1000)) | Q(hits__gte=5000))

    Atomic updates(원자 업데이트)QMongoDB ,QuerySet,update_one(),update() 방법으로 자동으로 업데이트할 수 있습니다.다음과 같은 몇 가지 방법을 사용할 수 있습니다.
  • modify() - 지정된 값으로 설정
  • set - 지정된 값을 삭제
  • unset - 값을 지정된 개수
  • 에 더하기
  • inc - 값을 지정된 개수
  • 에서 빼기
  • decpush에 값 추가
  • listpush_all에 값 추가
  • list - 제거pop의 첫 번째 항목이나 마지막 항목list의 값에 따라 첫 번째 항목을 삭제할지 마지막 항목을 삭제할지 결정하고, 일반적인 경우pop__=val 는 마이너스로 첫 번째 항목을 삭제하고, 정규로 마지막 항목을 삭제한다. 참고: 몬godb$pop
  • valval에서 값 제거
  • pull – 개list에서 값 제거
  • pull_all - 추가할 값이 list에 없을 때 이 값을 추가합니다
  • .
    원자 업데이트의 구문은 질의 구문과 유사하며 코스메틱 연산자가 필드 앞에 있는 것이지 뒤에 있는 것이 아닙니다.
    >>> post = BlogPost(title='Test', page_views=0, tags=['database'])
    >>> post.save()
    >>> BlogPost.objects(id=post.id).update_one(inc__page_views=1)
    >>> post.reload()  # the document has been changed, so we need to reload it
    >>> post.page_views
    1
    >>> BlogPost.objects(id=post.id).update_one(set__title='Example Post')
    >>> post.reload()
    >>> post.title
    'Example Post'
    >>> BlogPost.objects(id=post.id).update_one(push__tags='nosql')
    >>> post.reload()
    >>> post.tags
    ['database', 'nosql']

    코스메틱 연산자가 없는 경우 기본값은 add_to_set입니다.
    BlogPost.objects(id=post.id).update(title='Example Post')
    BlogPost.objects(id=post.id).update(set__title='Example Post')

    서버측 JavaScript 실행
    Javascript 함수를 작성하여 서버에 전송하여 실행할 수 있습니다.이 반환 결과는 Javascript 함수의 반환 값입니다.이 기능은 list 대상의 $set 방법을 통해 실현되었다.첫 번째 매개변수로 Javascript 함수를 포함하는 문자열을 전달합니다.
    나머지 위치의 매개변수 이름 필드는 Javascript 함수의 매개변수로 전달됩니다.
    JavaScript 함수 범위에서 다음 변수를 사용할 수 있습니다.
  • QuerySet() - 해당되는 exec_js()류의 집합 이름
  • collection – 1개Document 객체
  • query - QuerySet 함수에 전달할 매개 변수
  • 를 포함하는 대상
    def sum_field(document, field_name, include_negatives=True):
        code = """
        function(sumField) {
            var total = 0.0;
            db[collection].find(query).forEach(function(doc) {
                var val = doc[sumField];
                if (val >= 0.0 || options.includeNegatives) {
                    total += val;
                }
            });
            return total;
        }
        """
        options = {'includeNegatives': include_negatives}
        return document.objects.exec_js(code, field_name, **options)

    좋은 웹페이지 즐겨찾기