Django

2010-12-23 18 views
11

'daki çok-alanlı alanlı Instantiate model örneği Çalıştığım bir yönteme sahibim, ama çok beceriksiz görünüyor ve bunu yapmak için daha iyi bir yol olduğunu düşünürdüm.Django

Sitemdeki bir kullanıcıyı (öğrenme amaçlı bir twone klonu) diğer kullanıcıların bir listesiyle ilişkilendiren bir Modelim var.

Şu anda yeni bir kullanıcı oluşturduğumda, bu listeyi kullanıcıyla listenin bir üyesi olarak başlatmak istiyorum.

benim modelidir: Şu anda kullanıyorum Bence kod

class FollowerList(models.Model) 
    follower = models.ForeignKey(User,related_name="follower") 
    followed = models.ManyToManyField(User,related_name="followed" 

olduğunu

bu oluşturmak için bir yöntem var olması gerektiği gibi

user = User.objects.get(username=uname) 
flst = FollowerList() 
flst.follower = user 
flst.save() 
flst.followed.add(user) 
flst.save() 

Bana öyle geliyor save() öğesini iki kez çağırmadan, ancak dokümanlar veya başka herhangi bir yerde bulamıyorum. Sen de 2 hat kodu kısaltabilir

many2many.add() sonra kaydetmek aramaya gerek yok

cevap

12

:

flst = FollowerList.objects.create(follower=user) 
flst.followed.add(user) 
+0

konu bu ben FollowerList nesnesi olması gerekir söyleyerek bir hata alıyorum olduğunu ne zaman Birincil anahtar, önce ManyToManyField örneklerini ekleyebilir. Ve bunu görebilmek için görebildiğim tek yol, önce onu örneklendirmek ve kaydetmek, sonra da diğer alanı eklemektir. –

+0

Eh, FollowerList.objects.create (follower = kullanıcı) bir birincil anahtar verecektir. Kaydetmeyi yapar. –

+0

Bu konuda dokümanlar için herhangi bir bağlantı var mı? Herhangi bir ... – jperelli

4

Yuji cevabı doğrudur. Bir M2M alanına kaydedilene kadar nesne ekleyemezsiniz. Yine de örnekler oluşturmak için daha kısa bir yoldan bahsetmek istedim.

user = User.objects.get(username=uname) 
flst = FollowerList(follower=user) #use key word args to assign fields 
flst.save() 
flst.followed.add(user) 
# don't need to save after adding an object to many to many field. 

Bu sözdizimini boş bir örnek oluşturup alanları atamaktan biraz daha hoş buluyorum. Objects.create() yöntemi (Yuki tarafından belirtilen) daha iyi olsa da.

2

bu A geç cevap:

class FollowerList(models.Model): 
    follower = models.ForeignKey(User,related_name="follower") 
    followed = models.ManyToManyField(User,related_name="followed" 

    def __init__(*args, followed=[], **kwargs): 
     super(FollowerList, self).__init__(*args, **kwargs) 
     self.save() 
     for user in followed: 
      self.followed.add(user) 

yani burada açıkça __init__ işlevinde followed kelime argüman ele onca geçerken, şu şekildedir: Ayrıca yapıcı (__init__) geçersiz olabilir Diğer yapıcıya diğer args ve kwargs. save'a yapılan çağrı, nesnenin kaydedildiğinden ve böylece m2m ilişkisinde kullanılabildiğinden emin olur.

Sonra bu örneğin

flst = FollowerList(follower=user, followed=[user,]) 

Alternatif __init__ bir modeli kaydederek, Johannes belirttiği gibi beklenmez, bir çizgiyle FollowerList oluştururum sağlar. tercih edilen yaklaşım bir Manager yöntemi oluşturmak olacaktır - ayrıntılar için bkz: https://docs.djangoproject.com/en/1.9/topics/db/managers/ ve oluşturulacak bir FollowerList:

fl = FollowerList.objects.create(*args, followed, **kwargs) 
+1

gerçekten değil Init yönteminde modeli kaydetme, ancak iyi bir fikir olsa emin olun. yeni bir nesnenin bir örneğini oluşturursam bunun olmasını beklemezdim (eğer veritabanına kaydettirmek istiyorsam, objects.create() işlevini çağırırdım) –