2009-03-10 14 views
1

を保存する前のManyToManyFieldにオブジェクトを追加しますもしそうでなければ彼らも。Djangoのモデルは条件付き以下は、その目的がなく、かなり仕事であるん

class JobRecord(models.Model): 
    """JobRecord model""" 

    project    = models.ForeignKey(Project) 
    date    = models.DateField() 
    supervisor   = models.ForeignKey(User, related_name='supervisor_set') 

    operators   = models.ManyToManyField(User, related_name='operators_set', help_text='Include the supervisor here also.') 

    vehicles   = models.ManyToManyField(Vehicle, blank=True, null=True) 

    def __unicode__(self): 
     return u"%s - %s" % (self.project.name, self.date.strftime('%b %d')) 

    # --- over ride methods ---- # 

    def save(self, **kwargs): 
     # this must be done to get a pk 
     super(JobRecord, self).save(**kwargs) 

     # which makes this comparison possible 
     if self.supervisor not in self.operators.__dict__: 
      self.operators.add(self.supervisor) 

     # it seems to get this far ok, but alas, the second save attempt 
     # does not seem to work! 
     print self.operators.values() 
     super(JobRecord, self).save(**kwargs) 

あなたの専門知識をお寄せいただきありがとうございます。「エキスパート」です。

+0

ランダムなコードレビューコメントです。 if()の後にsuper()。save()メソッドを移動すると、一度だけ呼び出す必要があります。 – monkut

答えて

2

あなたは上司が事業者であるかどうかを確認するために、このような何かを行うことができます。

if self.operators.filter(id=self.supervisor.id).count() == 0: 

そして、あなたは多くの分野に多くの変更後の第2の時間を節約する必要はありません。 (多対多リレーションは独自のテーブルに格納されています)

+0

途中で...条件付きで動作しますが、add()メソッドではそれほどクラックはありませんか? –

1

私は次のように変更しました。実際には、どちらの条件でもこのトリックを行うようです。問題は、add()メソッドが私にとってうまくいかないことです。

#... 

def save(self, **kwargs): 
    super(JobRecord, self).save(**kwargs) 

    if self.operators.filter(id=self.supervisor.id).count() == 0: 
    #if self.supervisor not in self.operators.values(): 

     # either conditional will get to this point 
     self.operators.add(self.supervisor) # <-- this line doesn't save proper? 
+0

追加していないのですか?例外はありますか? self.operators.all()を印刷してみてください –

+0

多対多APIの使用法を見直すとよいでしょう:http://www.djangoproject.com/documentation/models/many_to_many/ –

0

私は同じ問題があります。あなたがdjangoフォームを使用している場合は、フォームが保存された後にチェックを行い、そこに多くを追加します。それが私が周りを回る唯一の方法でした。