如何在没有直通表的情况下保存 django manytomany 字段

时间:2021-01-07 12:46:15

标签: django django-models django-database manytomanyfield

我面临着无法摆脱的恶性循环;

假设我有以下模型:

class AgregatorProductCoupon(models.Model):
    AgregatorProductId = models.ManyToManyField(Product, related_name="coupons", db_column='AgregatorProductId', verbose_name=_("Agregator Product Id"))

    class Meta:
        managed = True
        db_table = 'AgregatorProductCoupon'

当我尝试保存一个实例时,我收到一个完整性错误说明

"<AgregatorProductCoupon: AgregatorProductCoupon object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.

但是当我尝试在没有 m2m rel 的情况下进行保存时,我显然会收到一个缺少必填字段的错误。

Cannot insert the value NULL into column 'AgregatorProductId', table 'test_dbo.dbo.AgregatorProductCoupon'; column does not allow nulls. INSERT fails.

我无法重新设计表格,因为它们也绑定到其他地方。 怎么办? 任何帮助将不胜感激。

编辑:追溯:

[2021-01-07 13:19:28,040] log_response - Internal Server Error: /admin/agregator/agregatorcoupons/78/change/
Traceback (most recent call last):
  File "C:\David\.venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\David\.venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\David\.venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\options.py", line 607, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\David\.venv\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\David\.venv\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\sites.py", line 223, in inner
    return view(request, *args, **kwargs)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\options.py", line 1650, in change_view
    return self.changeform_view(request, object_id, form_url, extra_context)
  File "C:\David\.venv\lib\site-packages\django\utils\decorators.py", line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\David\.venv\lib\site-packages\django\utils\decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\options.py", line 1536, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\options.py", line 1576, in _changeform_view
    self.save_related(request, form, formsets, not add)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\options.py", line 1122, in save_related
    self.save_formset(request, form, formset, change=change)
  File "C:\David\.venv\lib\site-packages\django\contrib\admin\options.py", line 1110, in save_formset
    formset.save()
  File "C:\David\.venv\lib\site-packages\django\forms\models.py", line 669, in save
    return self.save_existing_objects(commit) + self.save_new_objects(commit)
  File "C:\David\.venv\lib\site-packages\django\forms\models.py", line 803, in save_new_objects
    self.new_objects.append(self.save_new(form, commit=commit))
  File "C:\David\.venv\lib\site-packages\django\forms\models.py", line 949, in save_new
    obj.save()
  File "C:\David\agregator\models.py", line 2745, in save
    print(self.AgregatorProductId)
  File "C:\David\.venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 526, in __get__
    return self.related_manager_cls(instance)
  File "C:\David\.venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 821, in __init__
    raise ValueError('"%r" needs to have a value for field "%s" before '
ValueError: "<AgregatorProductCoupon: AgregatorProductCoupon object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.

0 个答案:

没有答案