版本: Python 3.4 Django 1.7
我创建了一个包含不同图库和自己图片的图库应用。
我的模特:
from django.db import models
class Gallery(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('publish date')
def __str__(self):
return self.title
class Image(models.Model):
title = models.CharField(max_length=200)
gallery = models.ForeignKey(Gallery)
pub_date = models.DateTimeField('publish date')
file = models.ImageField(upload_to='img/gallery/'+str(Gallery.objects.get(pk=str(gallery)).id)+'/')
def __str__(self):
return self.title
您会看到我的图库和图片模型。在后端创建图像时,它应该在" img / gallery / gallery_id"
中动态创建文件夹我的问题是 Image.gallery 在这里是一个ForeignKey,我无法将其转换为int或字符串以使用它。是否有一项功能可以使用我的图像对象中的ForeignKey从我的图库对象中获取ID?
我的解决方案
Gallery.objects.get(pk=str(gallery)).id
无效。
顺便说一句:我认为foreignkey总是像id那样的int?不是吗?
答案 0 :(得分:2)
上传到可以回调:
https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.FileField.upload_to
这样:
def gallery_folder(instance, filename):
return '/'.join(['img/gallery', instance.gallery.id, filename])
class Image(models.Model):
title = models.CharField(max_length=200)
gallery = models.ForeignKey(Gallery, related_name='images')
pub_date = models.DateTimeField('publish date')
file = models.ImageField(upload_to=gallery_folder)
def __str__(self):
return self.title
同时添加related_name,使反向查询更容易,如果需要,也可以选择instance.gallery.title
。
答案 1 :(得分:2)
Django的工作方式,自动添加一个方便的方法,它将为您提供外键所代表的模型实例。这是您的gallery
字段。还有另一个字段,称为相同但附加_id
的字段,用于保存实际的外键值。
正如petkostas所说,你可以传递一个接受instance
和filename
参数的函数。您应该使用gallery_id
而不是gallery.id
来防止对数据库进行不必要的调用。
def gallery_folder(instance, filename):
return '/'.join(['img/gallery', instance.gallery_id, filename])
class Image(models.Model):
...
file = models.ImageField(upload_to=gallery_folder)