Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-使用ForeignKey获取对象_Python_Django_Foreign Keys - Fatal编程技术网

Python Django-使用ForeignKey获取对象

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

版本: 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\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文件夹(…)
)。你能在你的问题中发布完整的回溯吗?