Django 진급-모형의 고급 사용법

10894 단어 Django
모델을 정의합니다.
from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __str__(self):
        return self.name

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    def __str__(self):
        return self.title

1. 액세스 키 값 ForeignKey , 。
>>>b = Book.objects.get(id=50)
>>>b.publisher

>>>b.publisher.website
'http://www.apress.com/'

2. ForeignKey 필드 역방향 접근book_set QuerySet 。book_set : _set 。
>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.all()
[, , ...]

3. 액세스 다중 쌍 다중 값 , QuerySet
>>> b = Book.objects.get(id=50)
>>> b.authors.all()
[, ]
>>> b.authors.filter(first_name='Adrian')
[]
>>> b.authors.filter(first_name='Adam')
, author.book_set
>>> a = Author.objects.get(first_name='Adrian',
last_name='Holovaty')
>>> a.book_set.all()
[, 's Other Book>]

4. 관리자
북에서.objects.all() 문장에서 Objects는 특수한 속성, 즉 모델의 관리자(관리자)로 데이터베이스를 조회합니다. -모델 관리자는 Django 모델이 데이터베이스 조회를 수행하는 데 사용하는 객체입니다.Django 모델에는 최소한 하나의 관리자가 있고 관리자를 사용자 정의하여 데이터베이스에 접근하는 방식을 사용자 정의할 수 있다.사용자 정의 관리자는 두 가지 이유에서 비롯될 수 있습니다. 추가 관리자 방법과 (또는) 수정 관리자가 되돌아오는 QuerySet을 추가합니다.
  • 관리자 추가
  • Book title_count(), ,
    from django.db import models
    # ... Author   Publisher       ...
    
    #        
    class BookManager(models.Manager):
        def title_count(self, keyword):
        return self.filter(title__icontains=keyword).count()
    #        
    class DahlBookManager(models.Manager):
        def get_queryset(self):
            return super(DahlBookManager,self).get_queryset().filter(author='Roald Dahl')
    
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
        num_pages = models.IntegerField(blank=True, null=True)
        objects = models.Manager() #       
        dahl_objects = DahlBookManager() #      Dahl     
    
        def __str__(self):
            return self.title

    사용
    Book.objects.title_count('django')
    Book.dahl_objects.all()
    Book.dahl_objects.filter(title='Matilda')
    Book.dahl_objects.count()

    5. 모델 기본 방법 수정 。 save() delete(), 。
    from django.db import models
    
    class Blog(models.Model):
        name = models.CharField(max_length=100)
        tagline = models.TextField()
        #     save  
        def save(self, *args, **kwargs):
            do_something()
            super(Blog, self).save(*args, **kwargs) #   “   ”save ()   
            do_something_else()

    6. 원본 SQL 조회 수행
    Manager.raw(raw_query, params=None, translations=None)
    
    #  
    class Person(models.Model):
        ...
    #      ('myapp_person'  myapp  Person  )
    for p in Person.objects.raw('SELECT * FROM myapp_person'):
        ...
  • 조회 중인 필드를 모델 필드에 비추기
  •    :
    Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person')
       :
    Person.objects.raw('''SELECT first AS first_name,last AS last_name,bd AS birth_date,pk AS id,FROM some_other_table''')
       :
    name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
    Person.objects.raw('SELECT * FROM some_other_table',translations=name_map)
  • 인덱스 및 슬라이스
  • first_person = Person.objects.raw('SELECT * FROM myapp_person LIMIT 1')[0]
  • 실행 조건 조회
  •     :
    Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])
        :
    query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname

    params 매개 변수를 사용하면 SQL 주입 공격을 완전히 피할 수 있습니다.이것은 흔히 볼 수 있는 빈틈으로 공격자는 데이터베이스에 임의의 SQL을 주입할 수 있다.만약 문자열 삽입값을 사용한다면, 조만간 너는 SQL 주입의 희생자가 될 것이다.파라메트릭 파라미터를 반드시 사용해야 보호받을 수 있다는 것을 명심해라.
    7. 사용자 정의 SQL 직접 실행
    ① 접속 획득:django.db.connection ② 커서 대상 가져오기:connection.cursor () ③ SQL 실행: cur- sor.excute(sql, [params])④ 결과 가져오기:cursor.fetchone () 또는cursor.fetchall()
  • 예:
  • from django.db import connection
    
    def my_custom_sql(self):
        cursor = connection.cursor()
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()
        return row
    , django.db.connections ( )。django.db.connec-tions , :
    from django.db import connections
    cursor = connections['my_db_alias'].cursor()

    좋은 웹페이지 즐겨찾기