为什么我不能在 Django 3 中保存 m2m 关系
why i cant save m2m relationships in Django 3
最近我将应用程序升级到 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
感谢您的帮助
您需要更改 i give 行,因为如果我们以字符串格式传递,则没有引用分配,我们需要作为模型名称传递
class Newsletter(Master):
...
contacts = models.ManyToManyField(Contact, blank=True, related_name="contacts", verbose_name=_('contacts')) # change here
您需要分配 Contact
而不是 'contact.Contact'
don't forgot makemigrations
and migrate
command
如果可行请告诉我
django 3 放弃对 postgres 9.4 的支持
https://docs.djangoproject.com/en/3.0/releases/3.0/#dropped-support-for-postgresql-9-4
最近我将应用程序升级到 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
感谢您的帮助
您需要更改 i give 行,因为如果我们以字符串格式传递,则没有引用分配,我们需要作为模型名称传递
class Newsletter(Master):
...
contacts = models.ManyToManyField(Contact, blank=True, related_name="contacts", verbose_name=_('contacts')) # change here
您需要分配 Contact
而不是 'contact.Contact'
don't forgot
makemigrations
andmigrate
command
如果可行请告诉我
django 3 放弃对 postgres 9.4 的支持 https://docs.djangoproject.com/en/3.0/releases/3.0/#dropped-support-for-postgresql-9-4