0

私はmodels.pyにこれを持っています:

 def get_absolute_url(self):
         return "/subject/%s/graphs/%s/" % (self.subject, self.slug)

件名とスラッグはそれに応じて次のとおりです。

subject = models.ManyToManyField(Subject)
slug = models.SlugField(max_length=120, unique=True)

関数でのアプローチget_absolute_url()が間違っていることはわかっており、 Subjectオブジェクトのリストを返します。

グラフの URL を作成できるように、1 つの要素にのみアクセスしたいのですが (どの要素であるかは問題ではありません)、その方法がわかりません。私はいくつかのことを試しましたが、うまくいきません。

アップデート:

解決策を得ました:

def get_absolute_url(self):
         for e in self.subject.all():
             return "/subject/%s/graphs/%s/" % (e.url_id, self.slug)

それはこのように動作します。常に存在するため、サブジェクトがあるかどうかを確認する必要はありません。

4

1 に答える 1

1

フィールドManyToManyは複数のオブジェクトを返す関係であるQuerySetため、URL の作成に使用するクエリセットから 1 つのオブジェクトを選択する必要があります。これには多くの方法があります。

たとえば、Subject モデルに日付フィールドがある場合、Subject を返すことができますlatest

return "/subject/%s/graphs/%s/" % (self.subject.all().latest("my_date_field"), self.slug)

または、クエリセットの最初のサブジェクトを取得してみることもできます。

return "/subject/%s/graphs/%s/" % (self.subject.all()[0], self.slug)

QuerySet APIを見て、自分に最も適したものを確認してください。

get_absolute_urlまた、モデルに関連付けられた Subject オブジェクトがない場合、メソッドが例外をスローする可能性が高いことを覚えておく必要があるため、次のようにする必要があります。

def get_absolute_url(self):
    try:
        return "/subject..."
    except:
        return "/another-url/"    
于 2013-03-11T12:16:20.667 に答える