0

モデルに ManyToManyField があります。以下のように、クエリごとに 3 番目の項目を取得する必要があります。

class Staff(models.Model):
    status = models.BooleanField(default=True)
    person = models.ForeignKey(Person)
    staff_job_categories = models.ManyToManyField(StaffJobCategory)
    staff_titles = models.ManyToManyField(PersonTitle, null=True, blank=True)

    def get_job_categories(self):
          return self.staff_job_categories.all()[3]

admin list_filter に get_job_categories 関数を使用していますが、多対多配列ごとに 3 番目の項目のみを表示したいと考えています。

しかし、 List index out of rangeエラーを取得します。ところで;

def get_job_categories(self):
    return self.staff_job_categories.all()[:3]

正常に動作します。しかし、私が望むものを得るまで、すべてのオブジェクトを取得します。

4

2 に答える 2

3

これは、3 つ未満のカテゴリにバインドされたジョブで機能するはずです。

return ( self.staff_job_categories.all()[2] 
         if self.staff_job_categories.count() >= 3 
         else None
       )

または:

return ( self.staff_job_categories.all()[2] 
         if len( self.staff_job_categories.all()[:3] ) >= 3 
         else None
       )

すべてのカテゴリの再集計を避けるため。

于 2012-10-03T12:37:08.050 に答える
0

シーケンスの最初の項目のインデックスは 0 です。3 番目の項目のインデックスは 2 です。それが唯一の問題でしょうか?

例:

def get_job_categories(self):
    return self.staff_job_categories.all()[2]

ただし、これは、すべてのスタッフが少なくとも 3 つのジョブ カテゴリを持ち、その順序が予測可能であることを確実に知っていることを前提としています。それは実際にそうですか?Django の ManyToManyField が、関連するオブジェクトが返される順序について保証するとは思いません。

于 2012-10-03T12:35:38.233 に答える