简述项目逻辑
问题解释:
我的表关系是:Books(每一本书只有一个出版社)–Publish(每个出版社出版多本书),就是一对多的关系。
数据表建立如下models.py:
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, unique=True)
city = models.CharField(max_length=32)
email = models.EmailField()
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
headImg = models.ImageField(upload_to='', null=True)
# 与Publish建立一对多的关系,外键字段建立在多的一方,字段publish如果是外键字段,那么它自动是int类型
publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE) # foreignkey里面可以加很多的参数
# to指向表,to_field指向你关联的字段,不写这个,默认会自动关联主键字段,on_delete级联删除
# 字段名称不需要写成publish_id,orm在翻译foreignkey的时候会自动给你这个字段拼上一个_id,这个字段名称在数据库里面就自动变成了publish_id
网页book.html:
还是返回到当前页面。
完成的后台逻辑:view.py
问题现象一:
IntegrityError at /books/(1048, “Column ‘publish_id’ cannot be null”)
告诉你,'publish_id’列不能为空。当books增加新数据时,添加的出版社信息时,该出版社应当已经存在。
所以,通常需要先建“一”的那张表,在填“多”的那张表。
解决方式入下:
先填publish表里的数据,再将查到的这个记录传给books填表时需要的publish字段。
问题现象二
一对多建表关系时,默认了publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
正确的写法:
def post(self, request):
publish_obj = models.Publish.objects.update_or_create(name=request.POST.get("book_pub"))
books_obj = models.Book.objects.update_or_create(
title=request.POST.get("book_name"),
price=request.POST.get("book_price"),
publishDate=request.POST.get("book_pubT"),
headImg=request.POST.get("book_face"),
publish=models.Publish.objects.get(name=request.POST.get("book_pub"))
)
return render(request, "try-on/books.html",
{
"ok_msg": "提交成功!",
}
)
第二种修改方法:
因为Book表在数据库中,存储的结构:
所以,在逻辑里面可以直接对publish_id赋值,publish_id存储的是Publish对应字段的id值。
def post(self, request):
publish_obj = models.Publish.objects.update_or_create(name=request.POST.get("book_pub"))
books_obj = models.Book.objects.update_or_create(
title=request.POST.get("book_name"),
price=request.POST.get("book_price"),
publishDate=request.POST.get("book_pubT"),
headImg=request.POST.get("book_face"),
publish_id=6
)
return render(request, "try-on/books.html",
{
"ok_msg": "提交成功!",
}
)
总结
- 建模型关系是,通常将多对一关系中,唯一的一方写进多的模型里面作为属性字段。
- 写逻辑增加表数据时,先写“一”的。在添加“多”表的数据。