Django 공식 문서 요약 (1) - Models 모델

23642 단어 Django
문서 목록
  • Django 관계 필드
  • #1 환경
  • #2 필드
  • #2.1 일대다(ForeignKey)
  • #2.1 매개변수
  • #2.2 자동 연결
  • #2.3 상관 관계
  • #2.4 데이터베이스 표현
  • #2.5 역방향 검색(related name)
  • #2.6 데이터를 직접 가져오는 대칭 이동(related query name)
  • #2.2 멀티 쌍(ManyToManyField)
  • #2.3 일대일(OneToOneField)
  • #3 Meta
  • #3.1 설정 테이블 이름
  • #3.2 테이블 간 주문 (order with respect to)
  • #3.3 유니크 together 결합
  • Django 관계 필드
    본고의 주요 내용은 Django 프레임워크 중의 모델에 대한 지식 소결이다
    #1 환경
    Python3.7.3
    Django==2.0.7
    

    #2 필드
    #2.1 일대다 (ForeignKey)
    일대다: fk 필드는 '다중' 모드에서 정의됩니다.
    from django.db import models
    
    class Blog(models.Model):
        name = models.CharField(max_length=100)
        tagline = models.TextField()
    
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name = models.CharField(max_length=200)
        email = models.EmailField()
    
        def __str__(self):
            return self.name
    
    class Entry(models.Model):
        blog = models.ForeignKey(
            Blog,
            on_delete=models.CASCADE,
            related_name="entryblogs",
            related_query_name="entryqueryblogs"
        )
        headline = models.CharField(max_length=255)
        body_text = models.TextField()
        pub_date = models.DateField()
        mod_date = models.DateField()
        authors = models.ManyToManyField(Author)
        n_comments = models.IntegerField()
        n_pingbacks = models.IntegerField()
        rating = models.IntegerField()
    
        def __str__(self):
            return self.headline
    

    #2.1 매개변수
    models.ForeignKey(to,on_delete,** options)
    # to :     (  )
    # on_delete :  "   "   (  )
    

    #2.2 자가 연관
    models.ForeignKey(to='self', on_delete=models.CASCADE)
    

    #2.3 연관 관계
    on_delete=None,               #           ,        field   
    on_delete=models.CASCADE,     #       ,       
    on_delete=models.DO_NOTHING,  #       ,     
    on_delete=models.PROTECT,     #       ,    ProtectedError
    # models.ForeignKey('   ', on_delete=models.SET_NULL, blank=True, null=True)
    on_delete=models.SET_NULL,    #       ,         null(  FK         ,     )
    # models.ForeignKey('   ', on_delete=models.SET_DEFAULT, default='   ')
    on_delete=models.SET_DEFAULT, #       ,            (  FK         ,     )
    on_delete=models.SET,         #       ,
    a.             ,  :models.SET( )
    b.                   ,  :models.SET(     )
    

    #2.4 데이터베이스 표현
    데이터베이스를 생성할 때 Django는 "id"필드 이름을 추가하여 데이터베이스 열 이름을 만들 수 있습니다. 이 내용을 명시적으로 변경할 수 있습니다 dbcolumn
    #2.5 역방향 찾기(related name)
    from django.db import models
    
    class Blog(models.Model):
        name = models.CharField(max_length=100)
        # ...
        
    class Entry(models.Model):
        blog = models.ForeignKey(
            Blog,
            on_delete=models.CASCADE,
            related_name="entryblogs",
        )
        # ...
    
  • 정방향 검색(Entry->Blog)
  • 외부 키 저장 테이블(Entry)-> 찾기-> 연결된 테이블(Blog)
    >>> e = models.Entry.objects.get(id=1)
    >>> e.blog
    <Blog: haha>
    
  • 역방향 검색(Blog->Entry)
  • 연결된 테이블(Blog) -> 찾기 -> 외부 키 저장 테이블(Entry)
    >>> b = models.Blog.objects.get(id=1)
    >>> b.entryblogs
    <django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x10d58c908>
    >>> b.entryblogs.all() #    ,                 ,  all()
    <QuerySet [<Entry: 1>]>
    

    #2.6 데이터를 직접 가져오는 대칭 이동(related query name)
  • 일반 쿼리
  • >>> b = models.Blog.objects.get(id=1)
    >>> models.Entry.objects.filter(blog=b).filter(headline=1)
    <QuerySet [<Entry: 1>]>
    
    
  • 데이터를 역방향으로 가져오기
  • >>> models.Blog.objects.filter(id=1).filter(entryqueryblogs__headline=1)
    <QuerySet [<Blog: haha>]>
    

    #2.2 멀티 쌍(ManyToManyField)
    ManyToManyField(to,**options)
    MtoM 필드는 필요에 따라 두 개의 관련 테이블 중 하나에 넣을 수 있습니다
    from django.db import models
    
    class Author(models.Model):
        name = models.CharField(max_length=200)
        email = models.EmailField()
        # ...
    
    class Entry(models.Model):
        authors = models.ManyToManyField(Author)
        # ...
    

    #2.3 일대일(OneToOneField)
    OneToOneField(to,on_delete,parent_link = False** options)
    

    #3 Meta
    class Entry(models.Model):
        blog = models.ForeignKey(
            Blog,
            on_delete=models.CASCADE,
            related_name="entryblogs",
            related_query_name="entryqueryblogs"
        )
        # ...
    
        class Meta:
            pass
    

    #3.1 테이블 이름 설정
    class Entry(models.Model):
        blog = models.ForeignKey(
            Blog,
            on_delete=models.CASCADE,
            related_name="entryblogs",
            related_query_name="entryqueryblogs"
        )
    
        class Meta:
            db_table = "app _Entry" 
            # app +  (    ,         ,        :  app +     )
    

    #3.2 테이블 간 주문 (order with respect to)
    현재 이 항목들을 통해 이 기능은 약간 불편하게 느껴지는데, 구체적으로 어떻게 사용하는지는 그래도 말해야 한다
  • 형식
  • class Entry(models.Model):
        blog = models.ForeignKey(
            Blog,
            on_delete=models.CASCADE,
            related_name="entryblogs",
            related_query_name="entryqueryblogs"
        )
        # ...
    
        class Meta:
            order_with_respect_to = 'blog' # fk   
    
  • 장면 사용
  • >>> b = models.Blog.objects.get(id=1)
    >>> b
    <Blog: haha>
    >>> b.get_entry_order()
    <QuerySet [1, 2]> #         int     ,   obj
    

    얻은 것은 단지 id로 구성된 목록일 뿐, 우리가 원하는queryset 데이터가 아니다
  • 사용
  • #       obj  
    b = models.Blog.objects.get(id=1) 
    # obj.get_       _order()
    b.get_entry_order()
    

    #3.3 유니크 together 결합
    주어진 필드를 합쳐서 표에서 유일한 값을 유지하다
    class Entry(models.Model):
        body_text = models.TextField()
        pub_date = models.DateField()
        # ...
        
        class Meta:
            unique_together = (("body_text", "pub_date"),)
    

    좋은 웹페이지 즐겨찾기