2010-03-27 26 views
10

:Django Yabancı anahtar sorguları aşağıdaki modelde

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

Ben tüm değerleri almak için kriterleri ve seçenekleri tabloları sorgulamak nasıl Id=1, title=value-mart , createdby=CEO

olarak tablo başlığındaki için veritabanında bir satır varsa masayı id =

1 Ayrıca bazı biri sorgular örnekler için iyi bir bağlantı önermek lütfen başlığından ilgili.

cevap

9

Her şeyden önce, kafa karıştırıcı olduğu için adlarda id kullanmayın. Bu alan kimlik değil, nesnenin kendisi.

options.objects.filter(header=a_header) 

Bazı başlık örneği üzerinde filtre uyguluyor değerdir herhangi bir değere, gibi sorgulamak (bir alan ref varsa otomatik bir alan ref_id oluşturur).

3

Models için Django belgelerinde gördüğünüz gibi bir coding style ve adlandırma kuralını denemenizi öneririz. Bunun gibi daha çok şey:

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

Sonra bunları gerektiği gibi sorgulamak:

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

many-to-one relationships belgesinde ayrıca bir usage example başvurur.

20

Ironfroggy haklı, ama alakalı options ve criteria nesneleri almak için başka daha bariz bir yolu yoktur. Django otomatik olarak bir modele işaret eden her yabancı anahtar için bir 'ters ilişki' oluşturur ve bu genellikle ilgili modelin artı _set'un adıdır. Yani:

mycriteria.options_set.all() 
mycriteria.header_set.all() 

size criteria nesneye mycriteria ile ilgili tüm options ve header nesneleri verecektir. Ayrıca

, stil bir not: ironfroggy belirttiği gibi, yabancı anahtar alanlarda id kullanmamalısınız, aynı zamanda size modeli sınıfları için Sermayelendirilmiş stili kullanmalıdır, böylece sınıfta Criteria arasında bir fark görebilirsiniz ve belirli bir örnek criteria. bağlantıların açısından

, Django documentation mükemmel ve tüm bu açıklar.

5

Following relationships "backward" ürününü arıyorum.

Sen filtreleme için kullanmak istediğiniz başlık nesnesini almak ve daha detaylı bilgi

için documentation de

obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

Look gibi bir şey kullanabilirsiniz

İlgili konular