2013-03-18 32 views
6

2 alanlı, çocuklu ve ebeveynli bir modelim var. Bunu djangoda nasıl yaparım? BuDjango modellerinde ağaç yapısı oluşturuluyor mu?

from django.db import models 
class FooModel(models.Model) 
    parent = models.ForeignKey('self', blank=True, null=True) 
    children = models.ManyToOneRel('self', blank=True, null=True) 

    def __init__(self, *args, **kwargs): 
     super(FooModel, self).__init__(*args, **kwargs) 
     self.parent.children.add(self) 

gibi bir şey var ama (bana 'boş' bir anahtar kelime hatası veriyor özellikle çünkü) ben böyle ManyToOneRel kullanmak gerekiyor sanmıyorum. Herhangi bir tavsiye?

+5

https://github.com/django-mptt/django-mptt/ – dm03514

+1

https://tabo.pe/projects/django-treebeard/docs/1.61/api.html – andrefsp

+0

Bunlar hem güzel, ama öyle Yukarıda yapmaya çalıştığım gibi doğrudan alanlarda yapmak mümkün mü? Bu konuda başka bir bağımlılık içermemeyi tercih ediyorum ve bu durumda o kadar çok verim umrumda değil. – sfendell

cevap

17

ManyToOneRel dahili bir uygulama sınıftır, modelinizde kullanılmaz.

Ama neden buna ihtiyacınız olduğunu düşünüyorsunuz? Dokümantasyon ayrıntılı olarak açıklandığı gibi, bir ForeignKey'i tanımladığınızda, otomatik olarak ters bir ilişki elde edersiniz. Yani parent tanımlarsanız sizin durumda, o zaman otomatik olarak zaten self.foomodel_set olsun: ve bunu daha da açık related_name parametresini kullanarak yapabilirsiniz: Eğer ağaçları ile komplike şeyler yapıyor planlıyorsanız o

parent = models.ForeignKey('self', blank=True, null=True, related_name='children') 

Not muhtemelen django-mptt kitaplığını kullanmak istiyorsunuz.

0

Ben bu yüzden code for it baktı ManyToOneRel belgelerine bulamadı: Gördüğünüz gibi

def __init__(self, to, field_name, related_name=None, limit_choices_to=None, 
     parent_link=False, on_delete=None): 

, hiçbir blank argüman yoktur.

+0

Doğru, ben zaten bunu anladım. Bunun yerine ne kullanmam gerektiğini merak ediyorum. – sfendell

+0

belki de çocukların anahtarlarını saklamak için bir CharField kullanabilir ve istek üzerine bunları oluşturmak için özel bir yöntem veya özellik kullanabilirsiniz? –

2
class FooModel(models.Model) 
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children') 


FooModel.objects.get(pk=1).children.all() 

istediğiniz her kullanımını önbelleğe istiyorsanız: bir yerde sorgu önbelleğe pks düz bir liste olarak ebeveyn tüm çocukları saklamak, ancak bu listeyi güncellemek için yeni varlıklar işlemek için unutma. ManyToOneRel django'nun dahili ihtiyaçları için daha da fazlası, Field sınıfının bir örneği değildir.

İlgili konular