Django : 테이블 구조가 일대 다인 경우 데이터를 추가하여 IntegrityError를보고합니다.

프로젝트 로직을 간략하게 설명합니다.
문제 설명 :
내 테이블 관계는 다음과 같습니다. 책 (각 책에 출판사가 한 명만 있음)-출판 (각 출판사가 여러 책을 출판 함)은 일대 다 관계입니다.
데이터 테이블은 다음 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

문제 현상 1 :

여기에 사진 설명 삽입
/ books / (1048, "Column'publish_id 'cannot be null")의
IntegrityError는'publish_id '열이 비어있을 수 없음을 알려줍니다. 책이 새 데이터를 추가 할 때 발행인 정보가 추가 될 때 발행인이 이미 존재해야합니다.
따라서 일반적으로 "하나"양식을 먼저 작성한 다음 "추가"양식을 작성해야합니다.

해결책은 다음과 같습니다.

먼저 게시 테이블에 데이터를 입력 한 다음 찾은 레코드를 책이 양식에 입력해야하는 게시 필드에 전달합니다.
여기에 사진 설명 삽입

문제 현상 2

여기에 사진 설명 삽입
일대 다 테이블 관계를 생성 할 때 기본값은 다음과 같습니다.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