And*_*dré 30 django django-models django-mptt
我的一个模型中有问题.我正在上传一个图片,我想存储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']
Run Code Online (Sandbox Code Playgroud)
问题出在url()方法上; 我只能self.id在更新对象时得到,我self.id在创建新对象时没有得到.如何self.id在创建新对象时修改此模型?
使用当前代码,当我创建一个新对象时,我将得到一个像以下网址:
MultimediaData/HelpAdImages/ItemKind/None/somefile.jpg
Run Code Online (Sandbox Code Playgroud)
我需要有类似的东西:
MultimediaData/HelpAdImages/ItemKind/35/somefile.jpg
Run Code Online (Sandbox Code Playgroud)
有线索吗?
Qia*_*Jin 31
如果它是一个新对象,您需要先保存它然后访问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."
Run Code Online (Sandbox Code Playgroud)
查看django的文档https://docs.djangoproject.com/en/dev/ref/models/instances/
小智 5
您可能需要将此文件/实例保存两次:
您可以在模型上使用 post_save 信号来查找创建的标志,并重新保存实例更新 url(并根据需要移动/重命名文件),因为实例现在将具有 ID。但是,请确保您仅以创建为条件执行此操作,否则您将不断循环保存:保存启动保存后信号,进行保存,启动保存后信号......
请参阅https://docs.djangoproject.com/en/dev/ref/signals/#post-save
实际上有一种方法可以解决这个问题。
class Test(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=150)
def __str__(self):
return self.name
def update_model(self):
# You now have both access to self.id and self.name
test_id = Test.objects.get(name=self.name).id
print(test_id)
# Do some stuff, update your model...
Test.objects.filter(id=test_id).update(name='New Name')
def save(self, *args, **kwargs):
super(Test, self).save(*args, **kwargs)
self.update_model() # Call the function
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21856 次 |
| 最近记录: |