Django에서 F 함수 사용

2146 단어 django
개인 블로그를 개발할 때, 매 글의 조회량을 통계하는 논리는 일반적으로 이렇게 쓴다.
post = Post.objects.get(...)
post.views += 1
post.save()

위의 문장은 이미 상당히 간단하지만 실제로는 더 좋은 방법이 있다. 바로 F 함수를 운용하는 것이다.
from django.db.models import F

post = Post.objects.get(...)
post.views = F('views') + 1
post.save()

보아하니 모두 차이가 많지 않은 것 같지만 F 함수를 사용하면 몇 가지 현저한 장점이 있다.
  • 운영 감소post.view += 1는 파이톤이 메모리에서 조작한 다음에 메모리에서 데이터를 데이터베이스로 업데이트한다.F('views') + 1는 직접 조작하는 데이터베이스로 조작 등급을 줄였다.
  • 경쟁을 피한다.경쟁이란 여러 개의 파이톤 라인이 같은 데이터를 동시에 업데이트하는 것을 말한다. post.view += 1 그 중 일부 업데이트 작업을 잃어버릴 수 있고 F('views') + 1는 데이터베이스를 직접 조작하기 때문에 데이터를 잃어버리는 문제가 없다.
  • F 함수가 메모리에서 작동하지 않기 때문에 데이터를 업데이트한 후 메모리의 모델 대상을 다시 갱신해야 합니다.
    ...
    post.save()
    #     
    post = Post.objects.get(...)

    또는 다음과 같이 하십시오.
    ...
    post.save()
    #     
    post.refresh_from_db()

    Done!
    이외에도 F 함수는 필드 간 검색을 지원합니다.
    # models.py
    class Age(models.Model):
        year = models.IntegerField(default=6)
        month = models.IntegerField(default=10)
    
    # --------------
    
    #      year > month    
    res = Age.objects.filter(year__gt=F('month'))
    F 함수는 플러스, 마이너스, 곱하기, 나누기, 추출 및 멱 연산을 지원합니다.
    Age.objects.filter(year__gt=F('month') * 2)
    Age.objects.filter(year__gt=F('month') + F('year'))

    또한 날짜 필드의 경우 다음을 쉽게 처리할 수 있습니다.
    >>> from datetime import timedelta
    >>> Entry.objects.filter(date__gt=F('pub_date') + timedelta(days=3))

    관계식 간의 검색도 가능합니다.
    # models.py
    class Person(...):
        name = ...
    
    class People(...):
        name = ...
    
    class Age(...):
        ...
        person = models.OneToOneField(Person, ...)
        people = models.OneToOneField(People, ...)
    
    # --------------
    
    #      person.name == user.name    
    res = Age.objects.filter(person__name=F('people__name'))
    F 함수에는 더 높은 용법이 있다. 예를 들어 집합과의 협조는 여기에 열거하지 않고 관심 있는 것은 문서로 가서 참관할 수 있다.

    좋은 웹페이지 즐겨찾기