42

モデルの 1 つに問題があります。画像をアップロードしていて、id (データベーステーブルに pk) を保存したいのですが、どの時点で Django が にアクセスできるかを知る必要があります self.id

models.py

class BicycleAdItemKind(MPTTModel):
    def url(self, filename):
        pdb.set_trace()

        url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename)
        return url

    def item_kind_image(self):
        return '<img align="middle" src="/media/%s" height="60px" />' % self.image
    item_kind_image.allow_tags = True     

    # Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista
    n_item_kind      = models.CharField(max_length=50) 
    parent           = TreeForeignKey('self', null=True,
                                      blank=True, related_name='children')
    description      = models.TextField(null=True, blank=True)
    image            = models.ImageField(upload_to=url, null=True, blank=True)
    date_inserted    = models.DateTimeField(auto_now_add=True)
    date_last_update = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.n_item_kind

    class MPTTMeta:
        order_insertion_by = ['n_item_kind']

問題はurl()メソッドにあります。self.idオブジェクトを更新するときだけ取得できself.id、新しいオブジェクトを作成するときは取得できません。self.id新しいオブジェクトを作成するときに取得できるように、このモデルを変更するにはどうすればよいですか?

現在のコードでは、新しいオブジェクトを作成すると、次のような URL になります。

MultimediaData/HelpAdImages/ItemKind/None/somefile.jpg

そして、次のようなものが必要です:

MultimediaData/HelpAdImages/ItemKind/35/somefile.jpg

手がかりはありますか?

4

6 に答える 6

42

新しいオブジェクトの場合は、最初に保存してから self.id にアクセスする必要があります。

"There's no way to tell what the value of an ID will be before you call save(), 
 because that value is calculated by your database, not by Django."

django のドキュメントを確認してくださいhttps://docs.djangoproject.com/en/dev/ref/models/instances/

于 2013-01-09T13:36:58.313 に答える
5

このファイル/インスタンスを 2 回保存する必要がある場合があります。

モデルで post_save シグナルを使用して、created フラグを検索し、インスタンスを再保存して URL を更新 (および必要に応じてファイルを移動/名前変更) できます。これは、インスタンスに ID があるためです。ただし、作成時にのみ条件付きでこれを行うようにしてください。そうしないと、保存で継続的にループします。保存すると、保存後の信号が開始され、保存が実行され、保存後の信号が開始されます...

https://docs.djangoproject.com/en/dev/ref/signals/#post-saveを参照してください

于 2013-01-09T14:01:46.517 に答える
-5
  q = Order.objects.values_list('id', flat=True).order_by('-id')[:1]
            if len(q):
                self.number = str(self.id) if self.id else str(int(q.get()) + 1)
            else:
                self.number = 1
于 2015-05-08T09:53:39.027 に答える