Django - 使用ForeignKey获取对象

时间:2014-06-17 15:05:35

标签: 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):
        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?不是吗?

2 个答案:

答案 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所说,你可以传递一个接受instancefilename参数的函数。您应该使用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)