2011-02-07 10 views
0
class UserProfile(models.Model): 
    project_assignments = models.ManyToManyField('drawingManager.Project', default=SetDefaultProject(self,default_assignment)) 
    user = models.OneToOneField(User) 
    default_project 

    def SetDefaultProject(self,default_assignment): 
     if default_assignment: 
      self.default_project = default_assignment 
     else: 
      self.default_project = #somehow choose newest project 

    def __unicode__(self): 
     admin_reference = self.user.first_name + self.user.last_name 
     return admin_reference 

私は以下の動作を達成しようとしています。ユーザーが追加されると、少なくとも1つのプロジェクト割り当てがデフォルトで設定されます。また、後で、オプションインタフェースを介して、デフォルトをproject_assignmentsのサブセットのいずれかに設定することができます。しかし、あなたが外部キーと多対多フィールドをPythonコードとして使用することができないときとできないときは、私には分かりません。DjangoはManyToManyモデルフィールドのサブセットとしてデフォルトを設定します

答えて

4

を(ClassNameFormatRecommendationsと混同しないように)&は、メソッド名にアンダースコア小文字の名前を使用することをお勧めしますy、あなたはForeignKeysとManyToManyFieldsが別のものを返すことを理解していません。

ForeignKeyは1対多の関係で、指し示す側に「1」が付きます。つまり、default_projectをForeignKeyとして定義した場合、self.default_projectは、Projectインスタンスを返します。これは他のインスタンスと同じように使用して割り当てることができます。

しかし、ManyToManyFieldは、名前が意味するように、の両方に "many"の関係を持っています。両方ともです。したがって、self.project_assignmentsは単一のインスタンスを返さないので、Djangoがデータベースから取得したインスタンスのリストを処理する方法であるQuerySetを返します。したがって、addremoveを使用してそのリストを操作するか、スライスして1つのインスタンスを取得できます。プロジェクトの割り当てのリストの最初のプロジェクトにdefault_project FKを設定したい場合たとえば、あなたがどうなる

self.default_project = self.project_assignments.all()[0] 

(実際のコードでは、あなたがその確率警戒しなければならないでしょうが、は、割り当てがないので、IndexErrorが発生します)。

+0

私の混乱でした。私はMany to Manyフィールドがクエリーセットを返したことに気付かなかった。だから、私はself.project_assignments.order_by(-date_added)[0]のように、プロジェクトにdate_addedというフィールドがあり、最新のプロジェクトを取得していると仮定して、self.default_project = self_default_project = – cmay

1

「外部キーと多対多フィールドをちょうどpythonコードとして使用できるときは私には分かりませんが、あなたの擬似コードは次のように変更されます:

def SetDefaultProject(self,default_assignment): 
    if default_assignment: 
     self.project_assignments.add(default_assignment) 
    else: 
     self.project_assignments.add(self.project_assignments.latest('id')) 
     # note: i don't know what your intent is, so please adapt to your needs 
     # the key here is `MyModel.objects.latest('id')` to retrieve the latest object 
     # according to the field specified. 'id', 'date_created', etc. 

PS:私はあなたがcorrectl理解していれば

http://www.python.org/dev/peps/pep-0008/

+0

このコードを使用すると、新しいproject_assignment default_assignment権限が追加されますか?スタイルのヒントをありがとう。 – cmay

関連する問題