2011-02-01 6 views
1

언어 리소스를 설명하는 OLAC metadata을 저장하고 있습니다. 메타 데이터 요소의 대부분은 반복 가능합니다. 예를 들어 리소스에는 두 개의 언어, 세 명의 작성자 및 네 개의 날짜가있을 수 있습니다.Django에서 같은 필드의 사본을 여러 개 저장하는 방법은 무엇입니까?

하나의 모델에 이것을 저장할 수있는 방법이 있습니까? 반복 가능한 각 메타 데이터 요소에 대한 모델을 정의하는 것은 과도한 것처럼 보입니다. 특히 모델에는 하나의 필드 만 있기 때문에 가치가 있습니다.

+2

"과도한 것처럼 보입니까?" 정말? 그것이 데이터베이스가 작동하기로되어있는 방법입니다. 왜 데이터베이스 "과잉 공격"의 적절한 사용을 부르는거야? –

+0

이 데이터의 궁극적 인 용도는 무엇입니까? 정규화해야합니까? 그런 다음 그것을 정상화해야합니다. 화면에 다시 침을 뱉어 야한다면 (예를 들어 데이터 일 뿐이며 운영 중이 아닙니다) 모든 것을 BLOB로 저장하십시오. – JohnO

답변

4

그것은 다음과 같이 많은 관계로 많은 통해 것이 가장 좋은 방법은 같은 소리 :

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을 사용할 수 있습니다. 이렇게하면 모든 외래 키를 따르므로 데이터베이스에 대량으로 도달 한 다음 개체가 메모리에있을 때 혼자있게됩니다 (캐시 됨).

0

'태그'요소를 선택하도록 선택할 수도 있습니다. 여기에는 유형과 값이라는 두 개의 필드가있을 수 있습니다. 이런 식으로 뭔가 : 당신이 종류의 시리즈를 입력 한 다음을 선택하여 관리 인터페이스를 사용할 수 있기 때문에 별도의 모델이 될 것을 선호

class TagType(models.Model): 
    name = models.CharField(max_length=50) 

class Tag(models.Model): 
    type = models.ManyToManyField(TagType) 
    value = models.CharField(max_length=200) 

class Resource(models.Model): 
    name = models.CharField(max_length=50) 
    tag = models.ManyToManyField(Tag) 

당신은 단지 태그 유형은 charfield 수있는 것을 선택 할 수 있지만, 새 태그를 추가 할 때 드롭 다운에서.

편집 : 데이터를 나중에 쉽게 처리 할 수 ​​있기 때문에 위의 해결 방법이 더 좋습니다. 이 정보를 입력하는 것 이상의 일을한다면 완벽한 모델을 정의하는 것이 좋습니다.

관련 문제