2013-08-07 2 views
-1

나는 장고에서 애매한 데이터베이스를 가지고있다. 데이터베이스는 읽기 전용이며 내 재산 관리 소프트웨어에서 작성합니다. 기본적으로 내보기에서 특정 레코드를 얻으려면이 쿼리를 작성해야합니다.Django Way이 쿼리를 작성 하시겠습니까?

SELECT * FROM propuserdefinedvalues WHERE propid = propid and userdefinedid = 49 

원시 SQL을하는 대신이를 실행하는 장고 방법이 있나요? 나는 "속성"테이블을 반복합니다. 이러한 레코드는 "userdefinedcalues"테이블에 있습니다.

여기 내 모델입니다.

class Property(models.Model): 
    propid = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=35L, blank=True) 
    shortname = models.CharField(max_length=6L, blank=True) 
    street1 = models.CharField(max_length=50L, blank=True) 
    street2 = models.CharField(max_length=50L, blank=True) 
    city = models.CharField(max_length=50L, blank=True) 
    state = models.CharField(max_length=2L, blank=True) 
    zip = models.CharField(max_length=50L, blank=True) 
    phone = models.CharField(max_length=21L, blank=True) 
    fax = models.CharField(max_length=50L, blank=True) 
    email = models.CharField(max_length=255L, blank=True) 
    manager = models.CharField(max_length=25L, blank=True) 
    billname1 = models.CharField(max_length=35L, blank=True) 
    billname2 = models.CharField(max_length=35L, blank=True) 
    billstreet1 = models.CharField(max_length=50L, blank=True) 
    billstreet2 = models.CharField(max_length=50L, blank=True) 
    billcity = models.CharField(max_length=50L, blank=True) 
    billstate = models.CharField(max_length=2L, blank=True) 
    billzip = models.CharField(max_length=50L, blank=True) 
    proptaxid = models.CharField(max_length=35L, blank=True) 
    rentchargetype = models.CharField(max_length=20L, blank=True) 
    lastpostdate = models.DateField(null=True, blank=True) 
    lastweeklypostdate = models.DateField(null=True, blank=True) 
    comments = models.CharField(max_length=25L, blank=True) 
    enablespeciallatecharge = models.IntegerField(null=True, blank=True) 
    fixedlatecharge = models.IntegerField(null=True, blank=True) 
    fixedlateamount = models.FloatField(null=True, blank=True) 
    fixedlaterentonly = models.IntegerField(null=True, blank=True) 
    percentlate = models.IntegerField(null=True, blank=True) 
    percentlateamount = models.FloatField(null=True, blank=True) 
    percentlatefullcharge = models.IntegerField(null=True, blank=True) 
    percentlaterentonly = models.IntegerField(null=True, blank=True) 
    perdaylate = models.IntegerField(null=True, blank=True) 
    perdaylateamount = models.FloatField(null=True, blank=True) 
    perdaylategrace = models.IntegerField(null=True, blank=True) 
    perdaylategracenum = models.IntegerField(null=True, blank=True) 
    perdatelatelimitamount = models.FloatField() 
    perdaylategracenonretro = models.IntegerField() 
    perdaylategraceexclweekends = models.IntegerField() 
    perdaylategraceexclholidays = models.IntegerField() 
    datecreated = models.DateTimeField(null=True, blank=True) 
    updated = models.DateTimeField(null=True, blank=True) 
    userid = models.IntegerField(null=True, blank=True) 
    logofile = models.CharField(max_length=255L, blank=True) 
    merchantid = models.CharField(max_length=255L, blank=True) 
    epaybankid = models.IntegerField() 
    epaylimit = models.FloatField() 
    epayenabled = models.IntegerField() 
    achconveniencefeeenabled = models.IntegerField() 
    ccconveniencefeeenabled = models.IntegerField() 
    rwaachconvenciencefeeenabled = models.IntegerField() 
    rwaccconveniencefeeenabled = models.IntegerField() 
    epayislimited = models.IntegerField() 
    epayusedefaults = models.IntegerField() 
    achconveniencefee = models.FloatField(null=True, blank=True) 
    ccconveniencefee = models.FloatField(null=True, blank=True) 
    rwaachconveniencefee = models.FloatField(null=True, blank=True) 
    rwaccconveniencefee = models.FloatField(null=True, blank=True) 
    epaychargetype = models.IntegerField() 
    epayamounttype = models.IntegerField() 
    epaysetamount = models.FloatField() 
    epaycustlimit = models.FloatField() 
    sqft = models.IntegerField() 
    lateminbalance = models.FloatField(null=True, blank=True) 
    defaultbank = models.IntegerField() 
    postday = models.IntegerField(null=True, blank=True) 
    active = models.IntegerField(null=True, blank=True) 
    iscommercial = models.IntegerField(null=True, blank=True) 
    assignedissueuserid = models.IntegerField(null=True, blank=True) 
    class Meta: 
     db_table = 'property' 

class Propuserdefined(models.Model): 
    id = models.IntegerField(primary_key=True) 
    userdefinedid = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=50L, blank=True) 
    type = models.IntegerField() 
    userid = models.IntegerField(null=True, blank=True) 
    updated = models.DateTimeField(null=True, blank=True) 
    datecreated = models.DateTimeField(null=True, blank=True) 
    combolist = models.TextField(blank=True) 
    class Meta: 
     db_table = 'propuserdefined' 

class Propuserdefinedvalues(models.Model): 
    userdefinedid = models.ForeignKey(Propuserdefined) 
    propid = models.ForeignKey(Property) 
    value = models.TextField(blank=True) 
    userid = models.IntegerField(null=True, blank=True) 
    updated = models.DateTimeField(null=True, blank=True) 
    datecreated = models.DateTimeField(null=True, blank=True) 
    class Meta: 
     db_table = 'propuserdefinedvalues' 

여기 여기 내 템플릿 당신의 도움에 미리

{% for property in properties %} 
{{ altname }}<br><br> 
{% endfor %} 

덕분에 내보기

def properties(request): 
    properties = Property.objects.all().order_by('state') 
    altname = SELECT * FROM propuserdefinedvalues WHERE propid = 73 and userdefinedid = 49 
    return render_to_response('properties/index.html', {'properties':properties, }, context_instance=RequestContext(request)) 

입니다. Brandon

+1

거룩한 쓰레기. 첫 번째 모델은 HUUUGE입니다. –

+1

가능한 [Access for DB의 특정 항목에 대한 내 for 문] (http://stackoverflow.com/questions/18090820/access-a-specific-item-in-db-in-my-for-statement) –

+0

실제로 템플릿의 모든 속성에 동일한 altname을 표시하려고합니까? 아니면 속성을 반복하면서 각기 다른 propid에 해당하는 altname을 가져 오려고합니까? –

답변

1

글쎄 이것은 매우 간단합니다.

var = 49 
Property.objects.filter(propid=var).filter(userdefinedid=var) 

그 방법 중 하나 일 것입니다.

1

확인 하시겠습니까? 정확히 무엇을 하려는지 짐작할 수 있습니다. 템플릿을 Propuserdefinedvalues으로 미리 찾고 각 속성에 대해 미리 정의 된 userdefinedid을 찾으려면이 방법을 사용하십시오 맞춤 템플릿 태그를 정의하거나 Property 클래스에서 메소드를 정의하는 것입니다. 필자는 후자에 대해 최소한의 HTML을 필요로하지 않는 경향이있다. 보기에서 모델 인스턴스에 속성을 추가 할 수도 있지만 그다지 우아하지 않다는 것을 알게됩니다.

class Property(models.Model): 
    # huge list of fields 

    def altname(self): 
     return self.propuserdefinedvalues_set.filter(userdefinedid__name='altname') 

또는 무엇이든 적절한 이름 - 가능하면 ID 하드 코딩을 피하십시오. 그런 다음 템플릿

: 뷰에서

{% for property in properties %} 
    {{ property.altname }}<br><br> 
{% endfor %} 

는 아마 성능을 향상합니다 참여 미리로드 당신의 검색어에 select_related을 사용.

+0

정말 고마워요. 이것은 정확하게 내가 찾고 있었던 것이었다. 장고가 ID를 선택하려고 시도하는 중 오류가 발생했습니다. – brandonmhp

+0

(1054, "알 수없는 열 ''필드 목록 ''의 propuserdefinedvalues.id '') – brandonmhp

+0

장고에서 ID 필드를 무시할 수있는 방법이 있습니까? – brandonmhp

관련 문제