Python Web开发:创建“产品”模型

来自CloudWiki
跳转至: 导航搜索

背景

1张产品图片(6个栅格),1行产品标题和部分文字说明(6个栅格)

本节使用模型之间的一对多关系-外键,来实现多图字段功能。

如果将产品模型中的图像单独拆分出去组成一个“产品模型”,那么一张产品图片只属于一个产品,而一个产品可以包含多张产品图片。这就是一对多的关系。

实训步骤

创建“产品”类

from django.db import models

from django.utils import timezone

# Create your models here.
class Product(models.Model):
    PRODUCTS_CHOICES = (
        ('家用机器人', '家用机器人'),
        ('智能监控', '智能监控'),
        ('人脸识别解决方案', '人脸识别解决方案'),
    )
    title = models.CharField(max_length=50, verbose_name=' 作品标题')
    description = models.TextField(verbose_name='作品详情描述')
    productType = models.CharField(choices=PRODUCTS_CHOICES,
                                   max_length=50,
                                   verbose_name='作品类型')
    price = models.DecimalField(max_digits=7,
                                decimal_places=1,#decimal_places:小数的最大位数
                                blank=True,
                                null=True,
                                verbose_name='作品价格')
    publishDate = models.DateTimeField(max_length=20,
                                       default=timezone.now,
                                       verbose_name='发布时间')
    views = models.PositiveIntegerField('浏览量', default=0)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '作品'
        verbose_name_plural = '作品'
        ordering = ('-publishDate', )


  • title: 产品标题
  • description: 产品的详细描述
  • productType:产品类型
  • __str__(self)函数:返回当前模型数据的title字段,使得该模型的每条数据在后台管理系统中均以每条数据的title字段来显示


创建“产品图片”类

该类从属于产品类,

class ProductImg(models.Model):
    product = models.ForeignKey(Product,
                                related_name='productImgs',
                                verbose_name='作品',
                                on_delete=models.CASCADE)
    photo = models.ImageField(upload_to='Product/',
                              blank=True,
                              verbose_name='作品图片')

    class Meta:
        verbose_name = '作品图片'
        verbose_name_plural = '作品图片'
  • product: 这是一个外键,用models.ForeignKey来声明,该外键第一个参数用于指明从属的类,此处为产品类Product ,另外一个参数
  • related_name用来声明逆向名称,也就是说如果需要在Product类中调用产品图片可以用该名称来调用。
  • photo:上传产品图片,其根路径由settings.py中的media参数设置(Python Web开发:创建数据模型),子路径由这里的upload_to参数制定。

注册模型

为了方便管理员管理模型,将上述模型注册到admin管理模块中。

productApp/admin.py:

from django.contrib import admin
from .models import Product,ProductImg

admin.site.register(Product)
admin.site.register(ProductImg)

同步数据库

python manage.py makemigrations

Migrations for 'aboutApp':
  aboutApp\migrations\0002_auto_20210510_1051.py
    - Change Meta options on award
    - Alter field description on award
    - Alter field photo on award
Migrations for 'productsApp':
  productsApp\migrations\0001_initial.py
    - Create model Product
    - Create model ProductImg

python manage.py migrate

Operations to perform:
  Apply all migrations: aboutApp, admin, auth, contenttypes, productsApp, sessions
Running migrations:
  Applying aboutApp.0002_auto_20210510_1051... OK
  Applying productsApp.0001_initial... OK

验证

打开管理后台,http://127.0.0.1:8000/admin/


Python21051001.png