如何在django中访问外键字段的属性?

goqiplq2  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(94)

在我的Django应用程序中,我有两个模型:ProductImage
一个产品可以有多个图像,而一个图像只能属于一个产品。
我希望能够创建一个子文件夹的产品本身的名称时,一个产品的图像上传的图像。因此,在Image模型中,我需要访问product的标题。
下面是我的代码:

class Product(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, blank=True, allow_unicode=True)

class Image(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, 
                                related_name='images')
    image = models.ImageField(upload_to=f'product_images/{product.title}/')

Image模型中,我有一个image字段,类型为ImageField,我想在其中获取product的标题。
我得到以下错误:
“ForeignKey”对象没有属性“title”
如何在Image型号中访问product的标题?

zmeyuzjn

zmeyuzjn1#

问题是因为这一行:

image = models.ImageField(upload_to=f'product_images/{product.title}/')

在定义模型时进行评估,在这种情况下,'product.title'还没有意义:只有当类的示例与关联的产品一起创建时才有意义。
要解决这个问题,请使用一个类似get_upload_to的辅助函数,并将其作为参数传递给upload_to,如下所示:

def get_upload_to(instance, filename):
    return f'product_images/{instance.product.title}/{filename}'

class Image(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to=get_upload_to)

这个方法之所以有效,是因为当Django调用get_upload_to方法时,它会自动将示例和文件名变量传递给它(请参阅官方文档:)https://docs.djangoproject.com/en/4.2/ref/models/fields/#django.db.models.FileField.upload_to参阅

相关问题