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()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.