事情是这样的。
一个分支可能包含许多产品。
表单将以字符串格式将路径
和分支
发布到产品模型。
在获取发布的数据时,如何使用这样的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/