Django:テーブル構造が1対多の場合、IntegrityErrorを報告するデータを追加します

プロジェクトロジックを簡単に説明する
問題の説明:
私のテーブルの関係は次のとおりです。本(各本には1つの出版社しかありません)-出版(各出版社は複数の本を出版します)、これは1対多の関係です。
データテーブルは次のように作成されます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

Webページbook.html:
ここに画像の説明を挿入
現在のページに戻ります。
ここに画像の説明を挿入
完成したバックグラウンドロジック:view.py

問題の現象1:

ここに画像の説明を挿入
/ books /(1048、 "列 'publish_id'をnullにすることはできません")の
IntegrityErrorは、 'publish_id'列を空にすることはできないことを示しています。書籍が新しいデータを追加する場合、出版社情報が追加されるときに出版社はすでに存在している必要があります。
したがって、通常、最初に「1つの」フォームを作成してから、「詳細」フォームに入力する必要があります。

解決策は次のとおりです。

最初に発行テーブルにデータを入力してから、見つかったレコードを、書籍がフォームに入力する必要がある発行フィールドに渡します。
ここに画像の説明を挿入

問題現象2

ここに画像の説明を挿入
1対多のテーブル関係を作成する場合、デフォルトは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": "提交成功!",
                       }
                      )

2番目の変更方法:
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. モデル関係を構築するために、通常、多対1関係の唯一の側面が属性フィールドとしてマルチモデルに書き込まれます。
    ここに画像の説明を挿入
  2. テーブルデータを増やすロジックを書くときは、最初に「1つ」を書いてください。「マルチ」テーブルにデータを追加します。

おすすめ

転載: blog.csdn.net/beauthy/article/details/113256578