如何在 django rest 中自动继承外键模型的字段?

Posted

技术标签:

【中文标题】如何在 django rest 中自动继承外键模型的字段?【英文标题】:How do I automatically inherit a foreignkey model's field in django rest? 【发布时间】:2020-07-24 00:47:19 【问题描述】:

Models.py,来自 django admin 我所做的是我可以将产品添加到 Featured 但问题是当我在 admin 中选择一个产品以使其成为特色时,我想自动继承该产品上传的图片 url该产品的创建时间。

class Product(models.Model):
    seller = models.ForeignKey(Seller, on_delete=models.CASCADE)
    title = models.CharField(max_length=120, primary_key=True)

    image = models.FileField()
    def __str__(self):
        return self.title


class FeaturedProduct(models.Model):
    db_identification = models.CharField(max_length=120)
    featured = models.ForeignKey(Product, on_delete=models.CASCADE)

    photograph = How do I inherit it automatically from foreignkey product selected?
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.db_identification

【问题讨论】:

【参考方案1】:

您可以覆盖FeaturedProduct的保存功能

class FeaturedProduct(models.Model):
    db_identification = models.CharField(max_length=120)
    featured = models.ForeignKey(Product, on_delete=models.CASCADE)

    photograph = models.FileField(blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.db_identification

    def save(self, *args, **kwargs):
        self.photograph = self.featured.image
        super(FeaturedProduct, self).save(*args, **kwargs)

【讨论】:

你不认为复制数据是一种不好的做法吗? 你可能是对的 :) 我实际上只是想展示原理。如果我正确解释了这个问题,那么问题的作者实际上只是想存储一个 url ...? 我不想复制任何东西,我只想获取图像 url。已为我尝试制作的产品保存 您只需将照片更改为 UrlField 并在保存方法中将其设置为正确的 url。 兄弟,该产品在媒体文件夹中已经有一个图像,并且作为 url 返回,但是现在当我选择一个产品作为外键时,我想获取/继承该选定产品的图像。当我导航到 /featured 时,它出现在 json 中【参考方案2】:

实际上,复制图像可能不是一个好主意。实际上,数据库旨在避免数据重复。无论如何,在您的代码中,如果您想要给定 FeaturedProductProduct 图像,您可以使用:

featured_product = FeaturedProduct.object.get(...)
image = feature_product.product.image

这样,你就没有重复了。 (例如,在图像更改的情况下更容易!)。

编辑:如果您想从 FeaturedProduct 轻松访问,您可以添加一个 util 方法:

class FeaturedProduct(models.Model):
    db_identification = models.CharField(max_length=120)
    featured = models.ForeignKey(Product, on_delete=models.CASCADE)

    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.db_identification

    @property
    def photograph(self):
       return self.product.image

【讨论】:

当我通过 django admin 选择要作为特色的外键然后导航到特色网址时,它应该显示它所做的产品,我已经做了特色,但我也希望它显示图像 url自动适用于该产品 你是对的。它错过了一个 util 方法来轻松获得它。我已经编辑了我的答案 谁能帮帮我? 我编辑了我的问题并添加了输出图片以选择要在特色中显示的产品,但是如何继承已经为该外键产品指定的图像 url? 谁能帮忙?

以上是关于如何在 django rest 中自动继承外键模型的字段?的主要内容,如果未能解决你的问题,请参考以下文章

当父记录存在时,如何在 django rest 框架的子序列化程序中设置外键值

如何在序列化程序 django rest 框架中为外键设置源

Django Rest API,如何为 2 个模型条目创建 post api,并具有与模型关联的外键

Django模型基于外键自动递增主键

Django 模型继承和外键

Django Rest Framework:具有通用外键的可写嵌套序列化程序