【问题标题】:How do I automatically inherit a foreignkey model's field in django rest?如何在 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

【问题讨论】:

    标签: python django database django-models django-rest-framework


    【解决方案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?
    • 谁能帮忙?
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2019-11-17
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多