首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django唯一约束失败: core_organization.name

Django唯一约束失败: core_organization.name
EN

Stack Overflow用户
提问于 2020-01-07 09:17:59
回答 3查看 1.9K关注 0票数 4

因此,我有一个名为Organization inside / model s.py的模型。我试图在一个页面上实现CRUD Ajax。受到这个帖子的启发。每次保存该模型的对象时,都会得到如下所示的错误。我希望有多个独特的组织。

core/models.py

代码语言:javascript
复制
class Organization(models.Model):
    name = models.CharField(max_length=255, unique=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    gstin = models.CharField(max_length=15)
    address = models.CharField(max_length=500)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=6)
    country = models.CharField(max_length=50)
    is_billed = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.name} Organization'

核心/forms.py.

代码语言:javascript
复制
class OrganizationForm(forms.ModelForm):
    class Meta:
        model = models.Organization
        fields = ('name', 'address', 'state', 'city', 'zipcode', 'country', 'gstin')

核心/views.py

代码语言:javascript
复制
def save_organization_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            stock = form.save(commit=False)
            stock.user = request.user
            stock.save()
            data['form_is_valid'] = True
            organizations = Organization.objects.all()
            data['html_book_list'] = render_to_string('core/includes/partial_organization_list.html', {
                'organizations': organizations
            })
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)


@login_required(login_url="/accounts/login/")
def organization_create(request):
    if request.method == 'POST':
        form = OrganizationForm(request.POST)
    else:
        form = OrganizationForm()
    return save_organization_form(request, form, 'core/includes/partial_organization_create.html')

templates/base.html

代码语言:javascript
复制
{% load static %}
<!DOCTYPE html>
<html>
  <head>
    <title>{% block head_title %}{% endblock %}</title>
    {% block extra_head %}
    {% endblock %}
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link href='https://fonts.googleapis.com/css?family=Russo One' rel='stylesheet'>
    <link rel="stylesheet" type="text/css" href="{% static 'font/flaticon.css' %}">
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
  </head>
  <body>
    {% block body %}

    {% if messages %}
    <div class="text-center">
      <strong>Messages:</strong>
      <ul>
        {% for message in messages %}
        <li>{{message}}</li>
        {% endfor %}
      </ul>
    </div>
    {% endif %}

    {% block content %}
    {% endblock %}
    {% endblock %}
    {% block extra_body %}
    {% endblock %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"
            integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
            integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
            integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
    {% block javascript %}
    {% endblock %}
  </body>
</html>

templates/core/organization_list.html

代码语言:javascript
复制
{% extends 'base.html' %}

{% load static %}

{% block javascript %}
  <script src="{% static 'organizations/js/organizations.js' %}"></script>
{% endblock %}

{% block content %}

  <h1 class="page-header">Organizations</h1>

<!-- BUTTON TO TRIGGER THE ACTION -->
  <p>
    <button type="button"
            class="btn btn-primary js-create-book"
            data-url="{% url 'organization_create' %}">
      <span class="glyphicon glyphicon-plus"></span>
      New Organization
    </button>
  </p>

  <table class="table" id="book-table">
    <thead>
      <tr>
        <th>#</th>
        <th>Name</th>
        <th>Address</th>
        <th>State</th>
        <th>City</th>
        <th>Zipcode</th>
        <th>Country</th>
        <th>Billing Active</th>
      </tr>
    </thead>
    <tbody>
      {% include 'core/includes/partial_organization_list.html' %}
    </tbody>
  </table>

<!-- THE MODAL WE WILL BE USING -->
  <div class="modal fade" id="modal-book">
    <div class="modal-dialog">
      <div class="modal-content">
      </div>
    </div>
  </div>
{% endblock %}

templates/core/partial_organization_list.html

代码语言:javascript
复制
{% for organization in organizations %}
  <tr>
    <td>{{ organization.id }}</td>
    <td>{{ organization.name }}</td>
    <td>{{ organization.address }}</td>
    <td>{{ organization.state }}</td>
    <td>{{ organization.city }}</td>
    <td>{{ organization.zipcode }}</td>
    <td>{{ organization.country }}</td>
    <td>{{ organization.is_billed }}</td>
    <td>
      <button type="button"
              class="btn btn-warning btn-sm js-update-book"
              data-url="{% url 'organization_update' organization.id %}">
        <span class="glyphicon glyphicon-pencil"></span> Edit
      </button>
      <button type="button"
              class="btn btn-danger btn-sm js-delete-book"
              data-url="{% url 'organization_delete' organization.id %}">
        <span class="glyphicon glyphicon-trash"></span> Delete
      </button>
    </td>
  </tr>
{% empty %}
  <tr>
    <td colspan="8" class="text-center bg-warning">No Organization</td>
  </tr>
{% endfor %}

static/organizations/js/organizations.js

代码语言:javascript
复制
$(function () {

  $(".js-create-book").click(function () {
    $.ajax({
      url: '/profile/organization/create/',
      type: 'get',
      dataType: 'json',
      beforeSend: function () {
        $("#modal-book").modal("show");
      },
      success: function (data) {
        $("#modal-book .modal-content").html(data.html_form);
      }
    });
  });

});


$("#modal-book").on("submit", ".js-book-create-form", function () {
    var form = $(this);
    $.ajax({
      url: form.attr("action"),
      data: form.serialize(),
      type: form.attr("method"),
      dataType: 'json',
      success: function (data) {
        if (data.form_is_valid) {
          $("#book-table tbody").html(data.html_book_list);  // <-- Replace the table body
          $("#modal-book").modal("hide");  // <-- Close the modal
        }
        else {
          $("#modal-book .modal-content").html(data.html_form);
        }
      }
    });
    return false;
  });


  $(".js-create-book").click(function () {
  var btn = $(this);  // <-- HERE
  $.ajax({
    url: btn.attr("data-url"),  // <-- AND HERE
    type: 'get',
    dataType: 'json',
    beforeSend: function () {
      $("#modal-book").modal("show");
    },
    success: function (data) {
      $("#modal-book .modal-content").html(data.html_form);
    }
  });
});


$(function () {

  /* Functions */

  var loadForm = function () {
    var btn = $(this);
    $.ajax({
      url: btn.attr("data-url"),
      type: 'get',
      dataType: 'json',
      beforeSend: function () {
        $("#modal-book").modal("show");
      },
      success: function (data) {
        $("#modal-book .modal-content").html(data.html_form);
      }
    });
  };

  var saveForm = function () {
    var form = $(this);
    $.ajax({
      url: form.attr("action"),
      data: form.serialize(),
      type: form.attr("method"),
      dataType: 'json',
      success: function (data) {
        if (data.form_is_valid) {
          $("#book-table tbody").html(data.html_book_list);
          $("#modal-book").modal("hide");
        }
        else {
          $("#modal-book .modal-content").html(data.html_form);
        }
      }
    });
    return false;
  };


  /* Binding */

  // Create book
  $(".js-create-book").click(loadForm);
  $("#modal-book").on("submit", ".js-book-create-form", saveForm);

  // Update book
  $("#book-table").on("click", ".js-update-book", loadForm);
  $("#modal-book").on("submit", ".js-book-update-form", saveForm);

  // Delete book
  $("#book-table").on("click", ".js-delete-book", loadForm);
  $("#modal-book").on("submit", ".js-book-delete-form", saveForm);

});

当我添加一个新的组织时,我会得到以下错误:

代码语言:javascript
复制
django.db.utils.IntegrityError: UNIQUE constraint failed: core_organization.name

我该怎么解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-22 19:36:19

我相信您的javascript文件包含重复的ajax调用。

有三个调用来创建您的模式:

代码语言:javascript
复制
$(function () {

  $(".js-create-book").click(function () {

在你的js文件的顶部。然后在js文件的中间使用相同的函数。和

代码语言:javascript
复制
var loadForm = function ()

将其绑定到脚本底部的单击事件。

此外,还有两个函数处理表单数据的提交:

代码语言:javascript
复制
$("#modal-book").on("submit", ".js-book-create-form", function ()

在上面的部分

代码语言:javascript
复制
 var saveForm = function ()

在底部。

提交表单的副本可能会导致唯一约束错误,因为您要两次提交相同的数据。重复加载的模态可能不会造成任何明显的错误,但是不必要的负荷。

javascript文件的底部部分,即以

代码语言:javascript
复制
$(function () {

  /* Functions */

应该就够了。

票数 1
EN

Stack Overflow用户

发布于 2020-01-14 15:39:13

我认为您有此问题,因为unique=True约束您的name字段。

代码语言:javascript
复制
name = models.CharField(max_length=255, unique=True)

这意味着名称对于所有用户都是唯一的,每次为不同用户添加相同的名称时,您都会得到UNIQUE constraint failed错误。

为了解决这个问题,我建议使用unique_together元选项。您所要做的就是从name字段中移除unique约束,并添加带有unique_toghether选项的Meta类,以同时包含user_idname字段。

代码语言:javascript
复制
class Organization(models.Model):
    name = models.CharField(max_length=255)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    address = models.CharField(max_length=1000, default=None)
    is_billed = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.name} Organization'

    class Meta:
        unique_together = ['name', 'user_id']

然后,python manage.py makemigrationspython manage.py migrate

UNIQUE约束将保持不变,但它将适用于与一个用户相关的所有Organization名称。

如果USER1拥有组织ORG1,并尝试添加另一个ORG1,则会失败,但如果USER2添加ORG1 1e 224,则会成功运行。

票数 0
EN

Stack Overflow用户

发布于 2020-01-20 16:19:58

尝试更新实例而不是表单对象,创建单独的端点/逻辑来更新实例,并创建一个单独的端点/逻辑来使用表单创建对象。

views.py

代码语言:javascript
复制
def save_organization_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            stock = form.instance
            stock.user = request.user
            stock.something = request.something
            stock.save()
            data['form_is_valid'] = True
            organizations = Organization.objects.all()
            data['html_book_list'] = render_to_string('core/includes/partial_organization_list.html', {
                'organizations': organizations
            })
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)


@login_required(login_url="/accounts/login/")
def organization_create(request):
    if request.method == 'POST':
        form = OrganizationForm(request.POST)
    else:
        form = OrganizationForm()
    return save_organization_form(request, form, 'core/includes/partial_organization_create.html')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59625373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档