5
class Product(models.Model):
    title = models.CharField(max_length=75)

class Deal(models.Model):
    product = models.ForeignKey(Product)
    slug = models.SlugField(max_length=255, unique=True)

上記と同様の基本設定を使用して、取引の製品タイトルと取引自体の ID を使用して、各取引インスタンスに固有のスラッグを生成したいと考えています。IE:"apple-iphone-4s-161"161取引の ID で、前のテキストは製品のタイトルです。

この場合、Deal モデルの save() メソッドを上書きして適用するにはどうすればよいですか?

4

4 に答える 4

7

もちろん、モデルの save() メソッドを単純に上書きすることもできます (または、post_save シグナルのレシーバーを作成することもできます)。次のようになります。

from django.template.defaultfilters import slugify

class Deal(models.Model):
product = models.ForeignKey(Product)
slug = models.SlugField(max_length=255, unique=True)

    def save(self, *args, **kwargs):
        super(Deal, self).save(*args, **kwargs)
        if not self.slug:
            self.slug = slugify(self.product.title) + "-" + str(self.id)
            self.save()

しかし、このソリューションの見苦しい点は、データベースに 2 回ヒットすることです (2 回保存されます)。これは、新しい Deal オブジェクトを作成するときに、最初に保存するまで ID がないためです (そして、それについて多くのことを行うことはできません)。

于 2012-08-15T22:47:50.770 に答える
3

私はこの問題にぶつかり、jasisz ソリューションをテストしましたが、最大再帰深度がエラーを超えたので、少しいじってみました。

def save(self, *args, **kwargs):
    if not self.id:
        self.slug = slugify(self.title)
    super(Node, self).save(*args, **kwargs)

ニーズに合わせてこれを編集できます。このレコードが存在するかどうかをテストし、存在しない場合はスラッグ フィールドを作成します。それ以外の場合は更新され、スラッグ フィールドを変更する必要はありません。

それが役に立てば幸い。

于 2012-08-16T19:06:10.413 に答える