【问题标题】:Django - Get Object with ForeignKeyDjango - 使用 ForeignKey 获取对象
【发布时间】:2014-06-17 15:05:34
【问题描述】:

版本: 蟒蛇 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

您会看到我的 图库图片 模型。在后端创建 Image 时,它应该在 "img/gallery/gallery_id"

中动态创建一个文件夹

我的问题是 Image.gallery 在这里是 ForeignKey,我无法将其转换为 int 或 string 来使用它。是否有一个函数可以使用我的 Image 对象中的 ForeignKey 从我的 Gallery 对象中获取 ID?

我的解决方案

Gallery.objects.get(pk=str(gallery)).id

不工作。

顺便说一句:我认为外键总是像 id 一样的 int?不是吗?

【问题讨论】:

  • 您可以通过隐藏字段 FOO_id (在您的情况下为gallery_id)直接访问id。 Gallery 字段应该是一个对象,但在 Django 查询中有一个快捷方式(又名魔法),允许您将其作为 id / pk 上的过滤器传递而不转换它:Gallery.objects.get(id=gallery).id

标签: python django foreign-keys


【解决方案1】:

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)

【讨论】:

  • 错过了,很好发现。
  • 谢谢你们的回答!但现在我在 BE 中创建图像时收到另一个错误消息。我必须在这里传递参数吗? file = models.ImageField(upload_to=gallery_folder) 或者我可以 c&p 你的编辑吗?我的错误:TypeError at /admin/gallery/image/add/ sequence item 1: expected str instance, int found(它在网站上显示,而不是在启动服务器时)
  • @Dude 你应该传递函数对象本身 (gallery_folder),而不是对函数的调用 (gallery_folder(...))。您可以在您的问题中发布完整的回溯吗?
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2020-12-18
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多