0

私の目標は、主キー (文字列) を生成し、アップロードされたファイルの名前をその文字列に一致するように変更することです。これは私の短縮モデルであり、upload_to私が使用する関数です。

class Thing(models.Model):
    id = models.CharField(primary_key=True, max_length=16)
    photo = ImageField('Photo', upload_to=upload_path, null=False, blank=False)
    ...



def upload_path(instance, filename):
    if not instance.id:
        randid = random_id(16)    # This returns a 16 character string of ASCII characters
        while Thing.objects.filter(id=randid).exists():
            logger.error("[Thing] ThingID of %s already exists" % randid)
            randid = random_id(16)
        instance.id = randid
    return "%s%s" % ("fullpath/",randid)

これにより、画像の名前が適切なパスのランダムな文字列に適切に変更されます。ただし、主キーは空の文字列に設定されています。

生成された主キーを使用して ImageField ファイルの名前を変更し、生成された主キー適切に保存するにはどうすればよいですか?

4

2 に答える 2

0

モデルで保存方法を定義するこのトラフを実現できます。True null空白のImageFieldを設定します。空のフィールドを制御する必要がある場合は、モデルフォームでそれらを制御できます。そのため、モデルのDBで一意のIDを簡単に生成できます。次に、一意のIDまたはカスタム生成されたIDを使用して画像を保存できます。私が提案する主キーには、デフォルトの一意の整数IDを使用することをお勧めします。

class Thing(models.Model):
    fake_id = models.CharField(max_length=16)
    photo = ImageField('Photo', upload_to=upload_path, null=True, blank=True)

    def save(self, *args, **kwargs):

        imagefile = self.photo

        self.photo = ''
        super(Thing, self).save(*args, **kwargs)

    """ after superclass save, you can use self.id also its unique integer """

        randid = random_id(16)    # This returns a 16 character string of ASCII characters
        while Thing.objects.filter(id=randid).exists():
            logger.error("[Thing] ThingID of %s already exists" % randid)
            randid = random_id(16)

       self.fake_id = randid

   """manipulate rename and upload your file here you object is 'imagefile' """

       save_dir = "fullpath/" + new_file_name_with_randid

       self.photo = save_dir

       super(Thing, self).save(*args, **kwargs)
于 2012-09-27T06:21:07.900 に答える
0

upload_to私はコールバックを削除し、これをすべてThingsave()メソッドで実行することになりました。

class Thing(models.Model):
    id = models.CharField(primary_key=True, max_length=16)
    photo = ImageField('Photo', upload_to=upload_path, null=False, blank=False)
    ...


    def save(self, *args, **kwargs):
        randid = random_id(16)
        while Thing.objects.filter(id=randid).exists():
            logger.error("[Thing] ThingID of %s already exists" % randid)
            randid = random_id(16)
        self.id = randid
        self.photo.name = ".".join([randid, self.photo.name.split(".")[-1]])   # This adds the file extension to the random id generated
        super(Thing,self).save(*args, **kwargs)
于 2012-09-28T14:35:02.157 に答える