Python Django-使用ForeignKey获取对象
版本: Python 3.4 Django 1.7 我用不同的画廊和他们自己的图片创建了一个画廊应用程序 我的模型:Python Django-使用ForeignKey获取对象,python,django,foreign-keys,Python,Django,Foreign Keys,版本: 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): re
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\u id”中动态创建文件夹
我的问题是,Image.gallery在这里是外键,我无法将其转换为int或string来使用。是否有从我的图像对象中使用外键从我的图库对象中获取ID的功能
我的解决方案
Gallery.objects.get(pk=str(gallery)).id
它不起作用
顺便说一句:我以为foreignkey总是一个int-like-id?不是吗?上传到可以是回调: 因此:
还可以添加相关的名称,使反向查询更容易,如果需要,还可以选择
instance.gallery.title
。上载到可以是回调:
因此:
还可以添加相关的名称,使反向查询更容易,如果需要,还可以选择
instance.gallery.title
。按照Django的工作方式,会自动添加一个方便的方法,为您提供外键表示的模型实例。这是您的gallery
字段。还有另一个名为相同但附加了\u id
的字段,它保存实际的外键值
正如petkostas所说,您可以传递一个接受实例
和文件名
参数的函数。您应该使用gallery\u 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)
按照Django的工作方式,会自动添加一个方便的方法,该方法将为您提供外键表示的模型实例。这是您的
gallery
字段。还有另一个名为相同但附加了\u id
的字段,它保存实际的外键值
正如petkostas所说,您可以传递一个接受实例
和文件名
参数的函数。您应该使用gallery\u 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)
您可以通过隐藏字段FOO_id(在您的案例中为gallery_id)直接访问该id。gallery字段应该是一个对象,但Django查询中有一个快捷方式(又名magic),允许您将其作为id/pk的过滤器传递,而无需转换:
gallery.objects.get(id=gallery.id
您可以通过隐藏字段FOO_id(在您的示例中为gallery_id)直接访问id。gallery字段应该是一个对象,但Django查询中有一个快捷方式(又名magic),允许您在id/pk上将其作为过滤器传递,而无需转换:gallery.objects.get(id=gallery.id
忽略了这一点,很好地找到了答案。谢谢大家!但是现在我在BE中创建图像时收到另一个错误消息。我必须在这里传递参数吗file=models.ImageField(上传到=gallery\u文件夹)
或者我可以对您的编辑进行c&p吗?我的错误:TypeError at/admin/gallery/image/add/sequence项目1:预期的str实例,int-found(它在网站上显示,而不是在启动服务器时显示)@Dude您应该传递函数对象本身(gallery\u文件夹
),而不是调用函数(gallery\u文件夹(…)
)。你能在你的问题中发布完整的回溯吗?错过了,很好地发现了。谢谢你们的回答伙计们!但是现在我在BE中创建图像时收到另一个错误消息。我必须在这里传递参数吗file=models.ImageField(上传到=gallery\u文件夹)
或者我可以对您的编辑进行c&p吗?我的错误:TypeError at/admin/gallery/image/add/sequence项目1:预期的str实例,int-found(它在网站上显示,而不是在启动服务器时显示)@Dude您应该传递函数对象本身(gallery\u文件夹
),而不是调用函数(gallery\u文件夹(…)
)。你能在你的问题中发布完整的回溯吗?