Как вставить поле ManyToMany в django
Я хочу вставить поля ManyToMany в мою базу данных, используя django. Я выбираю некоторых клиентов с помощью флажков. Вот мой models.py :
class Campaign(models.Model):
title = models.CharField(max_length=255)
channel = models.CharField(max_length=255)
start_date = models.DateField()
end_date = models.DateField()
target_prospect = models.ManyToManyField(ProspectClient,related_name='campaigns_prospect')
target_partner = models.ManyToManyField(PartnerClient,related_name='campaigns_partners')
Я попробовал код ниже в моем views.py, но он не работает :
def campaigns_page(request):
if request.user.is_authenticated:
if request.user.profile == 'D' or request.user.profile == 'E' or request.user.is_superuser:
campaigns = Campaign.objects.all()
prospects = ProspectClient.objects.all()
partners = PartnerClient.objects.exclude(id__in=PartnerClient.objects.values('id')).all()
context = {
'campaigns':campaigns,
'prospects':prospects,
'partners':partners
}
if request.method == 'POST':
title = request.POST['title']
channel = request.POST['channel']
start_date = request.POST['start_date']
end_date = request.POST['end_date']
descriptions = request.POST['goals'].split(",")
targets = request.POST['targets']
campaign = Campaign.objects.create(title=title,channel=channel,start_date=start_date,end_date=end_date)
for description in descriptions:
goal = Goal.objects.create(description=description)
goal.campaign.add(campaign)
for target in targets:
prospects.campaign.add(campaign)
partners.campaign.add(campaign)
return render(request,'CampaignManagement/campaigns_page.html',context)
return render(request, 'Login/logout.html')
Как я могу решить эту проблему?
Я вижу несколько ошибок. Возможно, одна или несколько из них приводят к проблеме.
Один
.
Попробуйте напечатать это:
partners = PartnerClient.objects.exclude(id__in=PartnerClient.objects.values('id')).all()
print(partners)
Я подозреваю, что он выведет None, поскольку вы исключаете все id в PartnerClient.objects.values('id'). С другой стороны, вам не нужно all(), поскольку exclude() вернет все результаты, которые вы ищете.
Два
.
В строке for target in targets: что именно вы итерируете? targets = request.POST['targets'] просто дает вам строку, поэтому она будет итерировать каждую букву. Возможно, вы имели в виду:
targets = request.POST['targets'].split(", ")
, как вы сделали для descriptions? Или, возможно, вы получаете список элементов из вашей формы, в этом случае вы можете использовать:
targets = request.POST.getlist('targets')