I have a Question model and a Choice model where a Question can have many
Choices so the Choice model has a Foreign Key mapping to a Question.
models.py:
from django.db import models
class Question(models.Model):
text = models.CharField(max_length=200)
title = models.CharField(max_length=200)
total_response_count = models.IntegerField()
topic = models.CharField(max_length=20)
sequence_num = models.IntegerField()
select_multiple = models.BooleanField(default=False)
def __str__(self):
return self.text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
text = models.CharField(max_length=200)
response_count = models.IntegerField()
response_percent = models.FloatField()
def __str__(self):
return self.text
I need to parse a csv file containing these models and insert them into a
database.
I want to be efficient and bulk create these models instead of having to
call save() after creating each model.
I can bulk create the Questions but then when I try to bulk create the
Choices I get an IntegrityError about the Choice's foreign key id attribute
("question_id") violating a not-null constraint.
After creating the Questions, the Question's id attribute gets updated but
the Choice's question_id attribute does not get updated and it does not get
re-evaluated when the Choice is created.
Here's a simplified version of what I want to do:
from censustest.models import Question,Choice
q=Question(text="Q1",title="",topic="",sequence_num=0,total_response_count=0)
c=Choice(text="C1",response_count=5,response_percent=0.3,question=q)
print("q.id %s, c.question %s, c.question_id %s" % (q.id, c.question,
c.question_id)) # None,Q1,None
Question.objects.bulk_create([q])
print("After creating q: q.id %s, c.question %s, c.question_id %s" % (q.id,
c.question, c.question_id)) # valid id,Q1,None
Choice.objects.bulk_create([c]) # ERROR: IntegrityError
Output:
<https://lh3.googleusercontent.com/-FFbndWx_lfU/WDjbHC_0QUI/AAAAAAAACPQ/xnwdyg_mVNM6lS-jytZTN7n0ujR7FzYiwCLcB/s1600/Screen%2BShot%2B2016-11-25%2Bat%2B7.42.20%2BPM.png>
*Is this a bug with Django *(the foreign key id attribute not being updated)*
or
is there a better way to do it?*
An alternative approach I thought of was to assign the Choice's Question
after creating the Questions and this works.
from censustest.models import Question,Choice
q=Question(text="Q1",title="",topic="",sequence_num=0,total_response_count=0)
c=Choice(text="C1",response_count=5,response_percent=0.3)
print("q.id %s" % (q.id)) # None,Q1,None
Question.objects.bulk_create([q])
c.question=q
print("c.question %s, c.question_id %s" % (c.question, c.question_id)) #
Q1,valid id
Choice.objects.bulk_create([c]) # works, no error
Output:
<https://lh3.googleusercontent.com/-pncM3xKl0Gc/WDjboxPCzWI/AAAAAAAACPU/V4I9TczbqnAm6mBnogU-kIVCvWXJ7ebrQCLcB/s1600/Screen%2BShot%2B2016-11-25%2Bat%2B7.43.53%2BPM.png>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/ddbf736b-2034-4d27-ae19-c4180b0a1bdf%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.