Django:表结构一对多时,添加数据报错IntegrityError

简述项目逻辑
问题解释:
我的表关系是: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": "提交成功!",
                       }
                      )

总结

  1. 建模型关系是,通常将多对一关系中,唯一的一方写进多的模型里面作为属性字段。
    在这里插入图片描述
  2. 写逻辑增加表数据时,先写“一”的。在添加“多”表的数据。

猜你喜欢

转载自blog.csdn.net/beauthy/article/details/113256578