为什么我不能在Django 3中保存M2M关系

时间:2020-03-06 04:54:58

标签: django django-models many-to-many django-orm django-postgresql

最近我已经升级到django 3,并已将其应用程序升级,并且我正在使用多对多关系来定义我想发送和发送电子邮件的人员,方式是:

class Contact(Master):
    name = models.CharField(max_length=100, blank=True, null=True, verbose_name=_('name'))
    email = models.EmailField(verbose_name=_("Email"), max_length=70, db_index=True, unique=True)

    class Meta:
        verbose_name = _("contact")
        verbose_name_plural = _("contacts")

    def __str__(self):
        return "{} - {}".format(self.name, self.email)

class Newsletter(Master):

    template = models.CharField(verbose_name="template",max_length=100,null=True,blank=True)
    subject = models.CharField(max_length=100,null=False)
    text_content = models.TextField(blank=True,null=True)
    send = models.BooleanField(db_index=True,default=True)
    contacts = models.ManyToManyField('contacts.Contact', blank=True, related_name="contacts", verbose_name=_('contacts'))

我进行了所有迁移,一切看起来都很正常,但是当我尝试通过“ admin”或“ shell”向通讯中添加联系人时,会显示此错误:

ProgrammingError at /es/admin/contacts/newsletter/4/change/

syntax error at or near "ON"
LINE 1: ... ("newsletter_id", "contact_id") VALUES (4, 1861) ON CONFLIC...

完整的追溯错误显示

Traceback (most recent call last):
  File "/home/beren5000/lib/python3.8/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.SyntaxError: syntax error at or near "ON"
LINE 1: ... ("newsletter_id", "contact_id") VALUES (4, 1861) ON CONFLIC...
                                                             ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/beren5000/lib/python3.8/django/db/models/fields/related_descriptors.py", line 944, in add
    self._add_items(
  File "/home/beren5000/lib/python3.8/django/db/models/fields/related_descriptors.py", line 1123, in _add_items
    self.through._default_manager.using(db).bulk_create([
  File "/home/beren5000/lib/python3.8/django/db/models/query.py", line 492, in bulk_create
    returned_columns = self._batched_insert(
  File "/home/beren5000/lib/python3.8/django/db/models/query.py", line 1230, in _batched_insert
    self._insert(item, fields=fields, using=self.db, ignore_conflicts=ignore_conflicts)
  File "/home/beren5000/lib/python3.8/django/db/models/query.py", line 1204, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/home/beren5000/lib/python3.8/django/db/models/sql/compiler.py", line 1384, in execute_sql
    cursor.execute(sql, params)
  File "/home/beren5000/lib/python3.8/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/home/beren5000/lib/python3.8/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/beren5000/lib/python3.8/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/beren5000/lib/python3.8/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/home/beren5000/lib/python3.8/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/beren5000/lib/python3.8/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: syntax error at or near "ON"
LINE 1: ... ("newsletter_id", "contact_id") VALUES (4, 1861) ON CONFLIC...

这似乎是一个错误或psycopg2中的某物,但我从未遇到过这样的错误,psycopg2的版本为psycopg2==2.8.4

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您需要在i给行中进行更改,因为如果我们以字符串格式传递,则需要引用作为模型名称来传递

class Newsletter(Master):
    ...
    contacts = models.ManyToManyField(Contact, blank=True, related_name="contacts", verbose_name=_('contacts')) # change here 

您需要分配Contact而不是'contact.Contact'

不要忘记makemigrationsmigrate命令

如果可以,请告诉我

答案 1 :(得分:0)

相关问题