#django #postgresql #django-south
#django #postgresql #django-south
Вопрос:
Я использую django 1.6, South и POstgres. Я новичок в south, и я чувствую, что мои таблицы db в отличаются от схемы или любых предыдущих миграций. В частности, я думаю, что поле существует для спрашивающего в комментариях (я отказался от этого дизайна). Как мне заставить south правильно обновиться. Я пробовал schemamigration —auto и migrate, и он говорит, что никаких изменений вносить не нужно.
views.py:
class AnswerCreate(CreateView):
model = Comment
template_name = 'answer_threads/create_thread.html'
fields = ['is_anon', 'comment_body']
success_url = '/conversations/'
def form_valid(self, form):
question_pk = self.request.path.split('/')[-2]
question = Question.objects.get(pk=question_pk)
questioner = question.questioner
commenter = self.request.user
self.object = form.save(commit=False)
self.object.question = question
self.object.commenter = commenter
new_comment = self.object.save()
try:
#thread already exists
thread = Thread.objects.get(question=question,
commenter=commenter)
thread.last_comment = new_comment
thread.save()
except Thread.DoesNotExist:
thread = Thread.objects.create(question=question,
questioner=questioner,
commenter=commenter,
last_comment=new_comment)
return super(AnswerCreate, self).form_valid(form)
также inpectdb:
class AnswerThreadsComment(models.Model):
id = models.IntegerField(primary_key=True)
comment_body = models.TextField()
commenter = models.ForeignKey('AuthUser')
questioner = models.ForeignKey('AuthUser')
question = models.ForeignKey('QuestionsQuestion')
order = models.IntegerField()
is_anon = models.BooleanField()
when_asked = models.DateTimeField()
thread = models.BigIntegerField()
class Meta:
managed = False
db_table = 'answer_threads_comment'
models.py
class Comment(models.Model):
comment_body = models.TextField()
is_anon = models.BooleanField(default=True)
when_asked = models.DateTimeField(auto_now_add=True)
question = models.ForeignKey(Question)
commenter = models.ForeignKey(User)
class Thread(models.Model):
question = models.ForeignKey(Question)
last_comment = models.ForeignKey(Comment)
commenter = models.ForeignKey(User, related_name='Comment.commenter')
questioner = models.ForeignKey(User, related_name='Question.questioner')
сообщение об ошибке:
IntegrityError at /questions/create_answer/1/
null value in column "questioner_id" violates not-null constraint
DETAIL: Failing row contains (8, 3.59, 2, null, 1, null,
f, 2014-07-05 19:59:14.639631 00,
null).
Request Method: POST
Request URL: **redacted**/questions/create_answer/1/
Django Version: 1.6.5
Exception Type: IntegrityError
Exception Value:
null value in column "questioner_id" violates not-null constraint
DETAIL: Failing row contains (8, 3.59, 2, null, 1, null,
f, 2014-07-05 19:59:14.639631 00,
null).
Exception Location: in execute, line 53
Python Version: 2.7.6
дальнейшая ошибка:
new_comment = self.object.save()
Variable Value
questioner <User: 3.46>
form <django.forms.models.CommentForm object at 0x7f63694546d0>
self <answer_threads.views.AnswerCreate object at 0x7f6369454690>
commenter <SimpleLazyObject: <User: 3.46>>
question <Question: 3.33>
question_pk u'1'
Комментарии:
1. Это поле
questioner
в вашей потоковой модели, вы должны добавить null = True к этому полю.2. Я внес изменения, чтобы показать, почему я думаю, что это происходит с созданием комментария. Кроме того, я хотел бы, чтобы поток представлял уникальный вопрос и уникального комментатора. Спасибо
Ответ №1:
Итак, для остальных:
чтобы очистить:
./manage.py migrate answer_threads zero
тогда просто
./manage.py schemamigration answer_threads --auto
затем
./manage.py migrate answer_threads