Django:根据字符串参数保存外键?

标签 django

事情是这样的。 一个分支可能包含许多产品。 表单将以字符串格式将路径分支发布到产品模型。

在获取发布的数据时,如何使用这样的Product.objects.create(path="path1",branch="branch1")? 或者分支实例必须在 forms.py 中创建?

这是错误的版本:它会引发ValueError:无法分配“'branch1'”:“Product.branch”必须是“Branch”实例。

class Branch(models.Model):
    name = models.CharField(max_length=63, unique=True, blank=True)


class Product(models.Model):
    path = models.CharField(max_length=255)
    branch = models.ForeignKey(Branch, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        kwargs['branch'], _ = Branch.objects.get_or_create(name=kwargs['branch'])
        super(Product, self).save(*args, **kwargs)

最佳答案

这不是保存问题。将字符串分配给分支名称期间会引发错误。如果要实现逻辑,请在保存之前执行

您可以使用 python property 来实现此目的,只需进行一些小的修改,如下所示。不需要重写 save 方法。

模型.py

class Branch(models.Model):
    name = models.CharField(max_length=63, unique=True)


class Product(models.Model):
    path = models.CharField(max_length=255)
    branch = models.ForeignKey(Branch, on_delete=models.CASCADE)

    @property
    def branch_name(self):
        return self.branch.name
    @branch_name.setter
    def branch_name(self, value):
        self.branch, _ = Branch.objects.get_or_create(name=value)

你的创建函数应该是

Product.objects.create(path="path1", branch_name="branch1")

注意:它是branch_name,而不是branch。此外,product.branch 仍然是 branch 对象,poduct.branch_name 返回分支的名称。这也适用于更新。即 product.branch_name 为新值,更新 product

branch

关于Django:根据字符串参数保存外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49788718/

相关文章:

javascript - Angular 2 前端 django 2 REST 框架后端用户身份验证

angularjs - Angular 和 Django Rest 框架

python - Django 验证错误 : ["“(' 1',)” value must be either True, 错误,或无。”]

ruby-on-rails - 哪个网络框架适合想要工作的人?

django - OAuth2 规范指出 'perms' 现在应该被称为 'scope' 。请更新。 Django Facebook 连接

python for循环不返回多个字典

django-registration View 自定义

python - Django - 保存用户后获取用户ID

python - Django:模板中的变量中的变量

python - Django Select Query获取带条件的多列