그것은 다음과 같이 많은 관계로 많은 통해 것이 가장 좋은 방법은 같은 소리 :
class author(models.Model):
# fields?
class language(models.Model):
iso_lang_code = models.CharField() # probably need some constraints here
class resource(models.Model):
name = models.CharField()
authors = models.ManyToManyField(Author)
languages = models.ManyToManyField(Language)
을 그 다음 리소스를 만들 때, 당신은 단순히 수행
r = resource(name="")
a1 = author(name="ninefingers")
a2 = author(name="jon skeet", type="god")
r.authors.add(a1)
r.authors.add(a2)
english = languages.objects.get(iso_lang_code="en-GB")
r.add(english)
r.save()
그리고 당신을
이
english = languages.objects.get(iso_lang_code="en-GB")
resourcesinenglish = english.resource_set.all()
for r in resourcesinenglish:
# do something on r.
그래서 ORM을 사용하여이 방법은 정말 힘 : 또한 같은 정말 멋진 물건을 할 수 있습니다 ful. 예, 기본적으로 SQL 테이블에있는 언어의 ISO 목록으로 끝나지 만 그게 문제입니까? 그렇다면 항상 문자열로 바꿀 수 있으며 WHERE language='en-GB'
의 SQL로 (대략) 변환되는 objects.filter(language='en-GB')
을 사용하십시오. 물론 한 언어로만 제한됩니다.
또 다른 방법은 스플리터에 의해 수정 된 ISO 코드로 모든 언어를 쓸 수 있습니다, 다음 물론
r = resource.objects.get(id=701)
langs = r.languages.split(';')
for l in language:
print l
할 ;
말, 목록이 그런 식으로 더 어려워진다 말했다 유지하는 단계. 나는 ORM이 훨씬 편하다고 생각한다.
Authors
과 같은 더 복잡한 유형의 경우 ORM이 훨씬 쉬운 방법입니다.
작성중인 데이터베이스 요청 수가 걱정된다면 항상 select_near
을 사용할 수 있습니다. 이렇게하면 모든 외래 키를 따르므로 데이터베이스에 대량으로 도달 한 다음 개체가 메모리에있을 때 혼자있게됩니다 (캐시 됨).
"과도한 것처럼 보입니까?" 정말? 그것이 데이터베이스가 작동하기로되어있는 방법입니다. 왜 데이터베이스 "과잉 공격"의 적절한 사용을 부르는거야? –
이 데이터의 궁극적 인 용도는 무엇입니까? 정규화해야합니까? 그런 다음 그것을 정상화해야합니다. 화면에 다시 침을 뱉어 야한다면 (예를 들어 데이터 일 뿐이며 운영 중이 아닙니다) 모든 것을 BLOB로 저장하십시오. – JohnO