django - 如何为关系模型创建或更新价值
问题描述
我想在 django 的 PortfolioProducts 模型中保存 Portfolio 产品详细信息
我有如下模型:
class Product(models.Model):
name = models.CharField(max_length=255,null=True, verbose_name ='Name')
class Portfolio(models.Model):
name = models.CharField(max_length=100, blank=True, null=True, verbose_name ='Name')
class PortfolioProducts(models.Model):
portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, verbose_name ='Portfolio')
product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name ='Product')
投资组合形式:
class PortfolioForm(forms.ModelForm):
class Meta:
model = Portfolio
fields = ['name']
我的视图文件:
def edit(request):
portfolio_form = PortfolioForm
if request.method=="POST":
portfolio_id=request.POST.get('portfolio_id')
portfolio_detail = Portfolio.objects.get(pk=portfolio_id)
pform = portfolio_form(request.POST, instance=portfolio_detail)
if pform.is_valid():
portfolio = pform.save(commit = False)
portfolio.save()
products=request.POST.getlist('product_id[]')
for product in products:
ppform = PortfolioProducts(product_id=product, portfolio_id=portfolio_id)
port_product = ppform.save()
我正在尝试保存和更新这样的产品组合,但多次将产品添加到产品组合中。
解决方案
好吧,您不需要为更新PortfolioProduct
而更新Portofilio
。因为即使你更新Portfolio
了,它的主键还是和以前一样。所以关系还是一样的。
但是,在您的情况下,如果和对象PortofolioProduct
中的产品不存在,那么您可以像这样创建一个:products
Portfolio
for product in products:
ppform, _ = PortfolioProducts.objects.get_or_create(product_id=product, portfolio_id=portfolio_id)
更新
来自评论:您需要def save(self):
从模型中删除方法(因为您没有在这些保存方法中做任何特别的事情),或者如果打算保留您save()
的方法,那么您需要正确调用超级,如下所示:
class Product(models.Model):
name = models.CharField(max_length=255,null=True, verbose_name ='Name')
def save(self, *args, **kwargs):
super(Product, self).save(*args, **kwargs)
class Portfolio(models.Model):
name = models.CharField(max_length=100, blank=True, null=True, verbose_name ='Name')
def save(self, *args, **kwargs):
super(Portfolio, self).save(*args, **kwargs)
class PortfolioProducts(models.Model):
portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, verbose_name ='Portfolio')
product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name ='Product')
def save(self, *args, **kwargs):
super(PortfolioProducts, self).save(*args, **kwargs)
推荐阅读
- asp.net - 无法从模型转换为视图模型,使用 AutoMapper asp.net 核心
- kubernetes - Kubernetes:创建动态本地卷以自动为 PVC 分配 PV 的最佳实践是什么?
- ubuntu - 如何在 ubuntu nginx 上为 blazor 站点提供正确的 mime 类型
- javascript - 响应式导航菜单对齐
- excel - 将 2 个循环合并为一个循环
- typescript - curried 定义在 uncurried 定义之后时的打字稿错误
- java - 如何在spring boot中仅发送主体请求中主要嵌套对象的ID
- go - go-gin中如何在中间件之间共享变量
- python - LSTM:层序的输入0与层不兼容
- css - 如何在 Vue.js 中基于屏幕高度媒体查询(按条件)删除样式绑定?