2010-07-30 15 views
39

...Django şablonundan çoktan çoğa "geçiş" tablosunun özelliklerine nasıl erişirim? Django belgelerine

sadece böyle karıştırma ve pizza ve Topingler eşleşen gibi basit çoktan-çok ilişkileri ile uğraşıyoruz, standart bir ManyToManyField tüm ihtiyaç vardır. Ancak, bazen verileri iki model arasındaki ilişkiyle ilişkilendirmeniz gerekebilir. Örneğin, müzisyenlerin ait olduğu müzik gruplarını takip eden bir uygulama örneğini düşünün. Bir kişi ile üye oldukları gruplar arasında çoktan çoğa ilişkisi vardır, bu nedenle bu ilişkiyi temsil etmek için ManyToManyField kullanabilirsiniz. Bununla birlikte, üyeliğin gruba katıldığı tarih gibi, toplamak isteyebileceğiniz üyelik hakkında birçok ayrıntı vardır.

Bu durumlarda, Django çoktan çoğa ilişkiyi yönetmek için kullanılacak modeli belirtmenize izin verir. Daha sonra ara modele ekstra alanlar koyabilirsiniz. Ara model, arabulucu olarak hareket edecek olan modele işaret etmek için tümüyle argüman kullanılarak ManyToManyField ile ilişkilidir. Bizim müzisyen Örneğin, kodu şöyle görünecektir: Şimdi (bu durumda Üyelik,) sizin aracı modelini kullanmak için ManyToManyField kurdunuz o

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 

, sen hazır çoktan çoğa ilişkiler oluşturmaya başla. Sen ara modelin örneklerini oluşturarak bunu:

ringo = Person.objects.create(name="Ringo Starr") 
paul = Person.objects.create(name="Paul McCartney") 
beatles = Group.objects.create(name="The Beatles") 

m1 = Membership(person=ringo, group=beatles, 
...  date_joined=date(1962, 8, 16), 
...  invite_reason= "Needed a new drummer.") 

m1.save() 

beatles.members.all() 
[<Person: Ringo Starr>] 

ringo.group_set.all() 
[<Group: The Beatles>] 

m2 = Membership.objects.create(person=paul, group=beatles, 
...  date_joined=date(1960, 8, 1), 
...  invite_reason= "Wanted to form a band.") 

beatles.members.all() 
[<Person: Ringo Starr>, <Person: Paul McCartney>] 

kaynak: http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

Sorum şu, ben bu ek niteliklere erişmek için görüşümü ve şablonu kurarım nasıl. Grup sayfam olduğunu ve grup adını görüntülediğimi, üyelik kayıtları üzerinden yinelendiğini ve adlarını ve tarihçelerini görüntülediğimi varsayalım.

Şablona bant nesnesi mi aktarmalıyım? Ya da üyelik nesnelerini bir şekilde geçebilir miyim?

Şablonda döngüleri nasıl oluşturabilirim?

Teşekkürler.

+1

Biraz django docs alıntılar kısaltarak ele alacak. Muhtemelen cevap vermesi muhtemel olan insanlar muhtemelen daha önceden tanışmışlardır ve gerçek soruya bu şekilde dikkat etmek daha kolay olurdu. – cji

cevap

32

En kolay yol, şeridi şablona aktarmaktır. Şablonlar, modeller arasındaki ilişkilerde gezinebilir ve Grup'ta hem üyeler hem de üyelik_set sorgu yöneticileri vardır.Yani burada ben bunu görecektir:

görünüm:

def group_details(request, group_id): 
    group = get_object_or_404(Group, pk=group_id) 
    return render_to_response('group_details.html', 
           {'group': group}) 

şablonu:

<h2>{{ group.name }}</h2> 
{% for membership in group.membership_set.all %} 
    <h3>{{ membership.person }}</h3> 
    {{ membership.date_joined }} 
{% endfor %} 
+2

Mükemmel çalışıyor. Group.membership.all ile tekrar denemeye çalışıyordum. _set üzerinde okumam gerek. Teşekkürler! – Alex

+0

Ama eğer daha karmaşık bir şeye ihtiyacınız varsa, yani sipariş vermek, filtrelemek vb. Standart uygulama, bunu görüşte yapmak ve daha sonra bu bağlamdan geçmek mi? – CpILL

+0

Önemli bir nokta, tablodan küçük olan sınıf adının "üyelik" olarak kullanılmasıdır. – MagicLAMP

6

Sadece çözüm olup olmadığından emin değilim, ancak ilişki nesnelerini şablona aktarmanız kesinlikle işe yarıyor.

rel = Membership.objects.filter(group = your_group).select_related() 

ve bu çünkü select_related() herhangi ek sorguları gerçekleştirmek gerektiğini {% for %}

{% for r in rel %} 
    {{ r.person.name }} joined group {{ r.group.name }} on {{ r.date_joined }}<br /> 
{% endfor %} 

Not ile bunun adımlayabilirsiniz şablona, ​​onu geçmek: Size göre, Üyelik nesnelerin Sorgu Kümesi olsun .