如何在 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】:实际上,复制图像可能不是一个好主意。实际上,数据库旨在避免数据重复。无论如何,在您的代码中,如果您想要给定 FeaturedProduct
的 Product
图像,您可以使用:
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 框架中为外键设置源