我想在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()
我试图像这样保存和更新产品组合产品,但是要多次向产品组合添加产品。
答案 0 :(得分:1)
好吧,您不需要更新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):
个方法(因为在这些保存方法中没有做任何特别的事情),或者打算保留{{1} }方法,那么您需要像这样正确地调用上级:
save()
答案 1 :(得分:0)
是的,我在django项目中也遇到了同样的问题。在我的案例中,它所做的事情是每次用户尝试更新其个人资料时,它都会创建一个新的个人资料,这是因为它具有外键。我通过在用户每次更新时删除以前的用户个人资料(在您的情况下为投资组合)来解决此问题。
class UserEdit(TemplateView):
template_name = 'accounts/homee.html'
def get(self, request):
form = UserProfilee()
ppp = UserProfile.objects.get(user=request.user)
return render(request, self.template_name, {'form': form, 'ppp': ppp})
def post(self, request):
form = UserProfilee(request.POST, request.FILES)
pppp = UserProfile.objects.get(user=request.user)
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
if not post.image:
post.image = pppp.image
UserProfile.objects.filter(user=post.user).delete()
post.save()
return redirect('/home/homepage/')
args = {'form': form}
return render(request, self.template_name, args)
如您所见,每当用户更新其个人资料时,我都会过滤用户并删除用户个人资料,从而仅留下1个用户个人资料。