2009-08-18 8 views
0

Previously은이 질문의보다 구체적인 버전을 묻는 데 사용했지만 내 질문이 무엇인지 명확하게 설명하는 데 어려움이있었습니다. 내가 선택한 솔루션이 문제에 대해 정확했다면 의심 스러웠다. 그래서 이번에는 문제를 설명하고 a) 내가 현재의 벽돌 벽 주위에 방법이 있다면 올바른 길을 가고 있는지 물어 본다.추가 필드가있는 일대일 관계가 내 작업에 적합한 도구입니까?

현재 소수의 사용자가 기존 데이터베이스를 조사 할 수 있도록 웹 인터페이스를 구축 중입니다. 워드 프로세서에서 비유로 튀어 나와, 내가 같이 보일 모델을 가지고 : 나는 하나 개의 중앙 테이블 (음악가) 및 외래 키 또는 OneToOneFields 중 하나가 관련되어 관련 데이터의 여러 테이블이

class Musician(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    dob = models.DateField() 

class Album(models.Model): 
    artist = models.ForeignKey(Musician) 
    name = models.CharField(max_length=100) 

class Instrument(models.Model): 
    artist = models.ForeignKey(Musician) 
    name = models.CharField(max_length=100) 

. 사용자는 필터링 기준을 만들어 메인 테이블이나 관련 테이블의 데이터를 기반으로 뮤지션의 하위 집합을 선택함으로써 데이터베이스와 상호 작용합니다. 마찬가지로 사용자는 제시된 결과의 순위 지정에 사용되는 데이터 조각을 선택할 수 있습니다. 결과는 처음에는 각 열의 선택된 데이터 필드 (또는 집계)가있는 음악가 당 하나의 행이있는 2 차원 테이블로 표시됩니다.

규모에 대한 아이디어를 얻기 위해 데이터베이스에는 약 20 명의 관련 데이터 필드가있는 5,000 명의 뮤지션이 있습니다.

여기까지는 문제가 없으며 작동하는 구현이 있습니다. 그러나 특정 사용자가 주석 데이터 세트 (둘 이상)를 업로드 한 다음 기존 데이터와 동일한 방식으로 필터링하고 정렬 할 수 있어야합니다.

class UserDataSets(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    description = models.CharField(max_length=64) 
    results = models.ManyToManyField(Musician, through='UserData') 

class UserData(models.Model): 
    artist = models.ForeignKey(Musician) 
    dataset = models.ForeignKey(UserDataSets) 
    score = models.IntegerField() 

    class Meta: 
     unique_together = (("artist", "dataset"),) 

내가 뮤지션 사이 1 개 관계를 1로 구성 데이터 세트 파일을 업로드 할 수 있으므로 사용자는 간단한 업로드 메커니즘이 :

내가이 일을 시도했던 방법은 모델을 추가했다 그들의 "점수". 주어진 사용자 데이터 세트 내에서 각 아티스트는 고유 할 수 있지만 서로 다른 데이터 세트는 서로 독립적이며 종종 동일한 뮤지션에 대한 항목을 포함합니다.

artist = Musician.objects.get(pk=1) 
dataset = UserDataSets.objects.get(pk=5) 
print artist.userdata_set.get(dataset=dataset.pk) 

그러나이 방법이 넘어 내가의 쿼리 세트의 필터링 및 순서를 구현하기 위해 왔을 때 :

내가 이런 식으로 뭔가를 할 수 주어진 작가부터 시작하여 데이터를 표시 괜찮 았는데 음악가는 단일 사용자 데이터 세트에 포함 된 데이터를 기반으로합니다. 예를 들어, 난 쉽게이 같은 UserData를 테이블의 모든 데이터를 기반으로 쿼리 세트를 주문할 수있다 :

artists = Musician.objects.all().order_by(userdata__score) 

을하지만 주어진 단일 사용자 데이터 세트의 결과에 의해 나에게 위해 도움이되지 않습니다. 마찬가지로 나는 다른 사용자 데이터 세트의 "점수"를 기반으로 쿼리 세트를 필터링 할 수 있어야합니다 (예 : dataset1에서 5보다 큰 점수를 가진 모든 뮤지션을 찾고 dataset2에서 < 2).

이 작업을 수행 할 수있는 방법이 있습니까, 아니면 전체적인 문제가 잘못 될까요?

답변

0

편집 : nevermind, 틀렸어. 나는 당신이 읽을 수 있도록 그것을 지킬 것이지만, 나는 그 후에 삭제할 것이다.

안녕하세요,

만약 내가 제대로 이해하고

,이 같은 시도 할 수 있습니다 : Q를 사용하는 방법에 대한 추가 정보를 원하시면

artists = Musician.objects.select_related('UserDataSets').filter(Q(userdata__score_gt=5, userdata__id=1) | Q(userdata__sorce_lt=2, userdata__id=2) 

을,이를 확인 : Complex lookups with Q objects.

관련 문제