save() prohibited to prevent data loss due to unsaved related object

前端 未结 3 829
情话喂你
情话喂你 2020-12-09 14:52

I need to pass a primary key from a newly created ModelForm to another form field in the same view but I get an error. Any suggestions to make this work? It loo

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-09 15:18

    This was introduced in Django 1.8. Previously you could assign not saved instance to One-To-One relation and in case of fail it was silently skipped. Starting from Django 1.8 you will get error message in this case. Check a documentation of Django 1.7 -> 1.8 upgrade.

    It says:

    Assigning unsaved objects to a ForeignKey, GenericForeignKey, and OneToOneField now raises a ValueError.

    If you are interested in more details, you can check save method in django.db.models.base: Some part of it:

    for field in self._meta.concrete_fields:
        if field.is_relation:
            # If the related field isn't cached, then an instance hasn't
            # been assigned and there's no need to worry about this check.
            try:
                getattr(self, field.get_cache_name())
            except AttributeError:
                continue
            obj = getattr(self, field.name, None)
            # A pk may have been assigned manually to a model instance not
            # saved to the database (or auto-generated in a case like
            # UUIDField), but we allow the save to proceed and rely on the
            # database to raise an IntegrityError if applicable. If
            # constraints aren't supported by the database, there's the
            # unavoidable risk of data corruption.
            if obj and obj.pk is None:
                raise ValueError(
                    "save() prohibited to prevent data loss due to "
                    "unsaved related object '%s'." % field.name
                )
    

    Last 5 rows are where this error is raised. basically your related obj which is not saved will have obj.pk == None and ValueError will be raised.

提交回复
热议问题