【问题标题】:How to manage django model relations properly?如何正确管理 django 模型关系?
【发布时间】:2019-11-12 11:18:38
【问题描述】:

在这里我正在制作一些旅游套餐系统。一个套餐会有画廊。当然画廊会有多个图像所以我决定在这里使用ManyToOne关系。但我也想过在这两者之间使用OneToOne关系模型,因为我们可以通过 django 表单一次上传多张图片。

那么这里最好的关系是什么?

 class TourPackage(models.Model):
        name = models.CharField(max_length=255)
        package_start_date = models.DateTimeField()
        price = models.FloatField(default=0.0)
        facilities = models.TextField()


    class PackageGallery(models.Model):
        package = models.ForeignKey(TourPackage,on_delete=models.CASCADE)
        images = models.ImageField(upload_to='gallery')

【问题讨论】:

    标签: django django-models orm


    【解决方案1】:

    在我看来,您创建ManyToOne 关系是正确的,因为您可能希望能够将多个图像添加到一个TourPackage

    几点说明:

    • PackageImagePackageGalleryItem 将是比画廊更好的名称(一个实例是单个图像,而不是画廊)。
    • images 应更改为 image
    • 如果您将related_name 添加到package,您将能够通过该名称查询TourPacakage 的图像,例如package.images
    • 确保您的缩进是正确的,因为现在,class PackageGallery(models.Model): 的缩进不正确,但这可能是复制过去的问题。

    总结一下:

    class TourPackage(models.Model):
            name = models.CharField(max_length=255)
            package_start_date = models.DateTimeField()
            price = models.FloatField(default=0.0)
            facilities = models.TextField()
    
    
    class PackageImage(models.Model):
        package = models.ForeignKey(TourPackage,on_delete=models.CASCADE, related_name='images')
        image = models.ImageField(upload_to='gallery')
    

    【讨论】:

      【解决方案2】:

      我也想过在这两个模型之间使用 OneToOne 关系,因为我们可以通过 django 表单一次上传多个图像。

      这不会改变关系的基数。 ImageField 仅存储有关单个图像文件的数据(应该如此),编写视图和表单/表单集以允许多次上传仅意味着您将同时创建多个 PackageGallery。这里没有什么魔法......

      哦,是的:我完全同意 Nico Griffioen 关于命名的 cmets(包括模型和字段)。

      【讨论】:

        【解决方案3】:

        我认为你应该使用多对一关系。因为每个包可以有多个图像。 一对一关系仅适用于您的包装只有一张图片。

        更多详情请访问https://docs.djangoproject.com/en/2.2/topics/db/examples/many_to_one/

        【讨论】:

          猜你喜欢
          • 2019-09-19
          • 1970-01-01
          • 2017-09-04
          • 1970-01-01
          • 2015-08-10
          • 2011-11-16
          • 1970-01-01
          • 2014-03-15
          • 2010-12-27
          相关资源
          最近更新 更多