Django | 대칭 이동 관계 추가 객체: 다대일

3563 단어 djangopython2.7
관련 모델에서, 예를 들어 다대일 또는 다대다 이런 유형은 일부 장면에서, 예를 들어 특정 사용자에게 탭을 간단하고 신속하게 추가하고, 대상을 신속하게 추가하기 위해 역방향 추가를 사용한다. 여기서 다대일 장면을 간단하게 설명한다.django 1.10.3
1 사용자 정의 모델 키 아님
1.1 모델 예
@python_2_unicode_compatible
class Author(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name


@python_2_unicode_compatible
class Posts(models.Model):
    headline = models.CharField(max_length=100)
    author = models.ForeignKey(Author, related_name="author_posts")

    def __str__(self):
        return self.headline

1.2 운영 프로세스
In [6]: author2 = Author.objects.create(name='paul')

In [7]: post2 = Posts(headline='hello post2')

In [11]: author2.author_posts.add(post2, bulk=False)
BEGIN

Execution time: 0.000018s [Database: default]

INSERT INTO "apple_posts" ("headline",
                           "author_id")
VALUES ('hello post2',
        2)

Execution time: 0.000314s [Database: default]

        
In [12]: author2.author_posts.add(post2, bulk=False)
BEGIN

Execution time: 0.000018s [Database: default]

UPDATE "apple_posts"
SET "headline" = 'hello post2',
    "author_id" = 2
WHERE "apple_posts"."id" = 3

Execution time: 0.000257s [Database: default]


여기에 주의사항 추가bulk=False2 모델 기본 키 사용자화
2.1 모델 예
import uuid


class BaseBackBone(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid1().hex, editable=False, max_length=32)

    class Meta:
        abstract = True


@python_2_unicode_compatible
class AuthorWithId(BaseBackBone):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name


@python_2_unicode_compatible
class PostsWithId(BaseBackBone):
    headline = models.CharField(max_length=100)
    author = models.ForeignKey(AuthorWithId, related_name="author_posts")

    def __str__(self):
        return self.headline

2.2 운영 프로세스
In [2]: author1 = AuthorWithId.objects.create(name='paul')

In [3]: post1 = PostsWithId(headline='hello post1 with id')

In [5]: author1.author_posts.add(post1, bulk=False)
BEGIN

Execution time: 0.000019s [Database: default]

UPDATE "apple_postswithid"
SET "headline" = 'hello post1 with id',
    "author_id" = '7d9d0f91ad6f11e6b0c1f45c89a84eed'
WHERE "apple_postswithid"."id" = '7d9d0f91ad6f11e6b0c1f45c89a84eed'

Execution time: 0.000141s [Database: default]

INSERT INTO "apple_postswithid" ("id",
                                 "headline",
                                 "author_id")
SELECT '7d9d0f91ad6f11e6b0c1f45c89a84eed',
       'hello post1 with id',
       '7d9d0f91ad6f11e6b0c1f45c89a84eed'

Execution time: 0.000291s [Database: default]

        
In [6]: author1.author_posts.add(post1, bulk=False)
BEGIN

Execution time: 0.000021s [Database: default]

UPDATE "apple_postswithid"
SET "headline" = 'hello post1 with id',
    "author_id" = '7d9d0f91ad6f11e6b0c1f45c89a84eed'
WHERE "apple_postswithid"."id" = '7d9d0f91ad6f11e6b0c1f45c89a84eed'

Execution time: 0.001262s [Database: default]


3 요약
사용자 정의 메인 키를 사용하여 대상을 추가할 때 데이터베이스에서 조회 작업을 한 번 더 할 것입니다. 왜냐하면 Django는 업데이트인지 삽입 작업인지 검증해야 하기 때문입니다.사용자 정의 키 장면을 사용하면 데이터베이스에 대한 조회 조작이 증가합니다.

좋은 웹페이지 즐겨찾기