Ошибка внешнего ключа в django. Невозможно назначить «1»: «Release.projectID» должен быть экземпляром «Project» - PullRequest
0 голосов
/ 16 мая 2019

У меня есть две модели: «Проект» и «Релиз». В таблице релизов projectId - это внешний ключ, связанный с таблицей Project. При попытке создать новую версию, при вводе идентификатора проекта, получить:

Cannot assign "'1'": "Release.projectID" must be a "Project" instance

У меня есть три файла с именами: models.py, forms.py, views.py

models.py:

class Project(models.Model):
        JIRAID = models.CharField(max_length=20,null=True)
        projectID = models.AutoField(primary_key=True)
        projectName = models.CharField(max_length=100)
        projectDescription = models.CharField(max_length=100)
        projectStartDate = models.DateField()
        projectEndDate = models.DateField()
        projectEstimatedLOE = models.IntegerField()
        createdBy = models.CharField(max_length=30)
        createdAt = models.DateTimeField(default=datetime.datetime.now,null=True,blank=True)
        updatedAt = models.DateTimeField(default=datetime.datetime.now,null=True,blank=True)

        def __str__(self):
                return (self.JIRAID, self._get_pk_val, self.projectName, self.projectDescription, self.projectStartDate, self.projectEndDate, self.projectEstimatedLOE,self.createdBy,self.createdAt,self.updatedAt)


        class Meta:
                db_table='Project'

class Release(models.Model):
        JIRAID = models.CharField(max_length=20 )
        projectID = models.ForeignKey(Project,on_delete=models.CASCADE,null=True)
        releaseID = models.AutoField(primary_key=True)
        releaseName = models.CharField(max_length=100)
        releaseDescription = models.CharField(max_length=100)
        releaseStartDate = models.DateField()
        releaseEndDate = models.DateField()
        releaseEstimatedLOE = models.IntegerField()
        createdBy = models.CharField(max_length=30)
        createdAt = models.DateTimeField(default=datetime.datetime.now, null=True, blank=True)
        updatedAt = models.DateTimeField(default=datetime.datetime.now, null=True, blank=True)

        def __str__(self):
                return (self.JIRAID, self.projectID,self._get_pk_val,self.releaseName, self.releaseDescription, self.releaseStartDate, self.releaseEndDate, self.releaseEstimatedLOE,self.createdBy,self.createdAt,self.updatedAt)


        class Meta:
                db_table='Release'
                unique_together = (('projectID', 'releaseID'),)


Views.py:

def releasecreation(request):
    context = {'form': Release}
    if request.method=='POST':
        form = ReleaseCreationForm(request.POST)

        if form.is_valid():
            JIRAID=request.POST.get('JIRAID')
            projectID=Project.objects.get('projectID')
            releaseID=request.POST.get('releaseID')
            releaseName=request.POST.get('releaseName')
            releaseDescription=request.POST.get('releaseDescription')
            releaseStartDate=request.POST.get('releaseStartDate')
            releaseEndDate=request.POST.get('releaseEndDate')
            releaseEstimatedLOE=request.POST.get('releaseEstimatedLOE')
            createdBy = User.objects.get(username=request.user.username)
            form.save()

            return render(request,'releasepages/releasecreateconfirmation.html')
        else:
            return render(request,'releasepages/releasecreate.html')
    else:
        return render(request,'releasepages/releasecreate.html',context)




Я должен быть в состоянии создать релиз, получив выпадающий список в столбце projectID при создании релиза.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Есть несколько вещей, которые не совсем верны с этим кодом:

  • форма установки класс в контексте

    Шаблон, вероятно, ожидает экземпляр формы, а не класс, например: {'form': Release()} (обратите внимание на круглые скобки).

    Кроме того, специально ли это не тот класс, который используется ReleaseCreationForm ниже?

  • определение группы переменных и их отсутствие

    Если только не удален какой-либо код, я не вижу никакого использования для всех этих переменных, определенных сразу после if form.is_valid():.

  • выполнить перенаправление http после сохранения

    Когда форма была успешно сохранена, приложение должно выполнить перенаправление вместо рендеринга шаблона. Это необходимо для предотвращения повторной отправки формы, если пользователь решит перезагрузить страницу.

Я предлагаю внимательно следить за структурой вида отсюда: https://docs.djangoproject.com/en/2.2/topics/forms/#the-view Здесь есть все «если», необходимые для обработки формы, и они имеют точно правильную структуру. Если бы соблазн изменить эту логику, я бы очень и очень предупредил, что я делаю что-то не так.


Но чтобы ответить на ваш вопрос напрямую, чтобы (вручную) создать экземпляр Release, вы можете сделать одну из следующих двух вещей:

project_instance = Project.objects.get(projectID=123)
Release.objects.create(
    projectID=project_instance,
    # other_fields...
)

или

Release.objects.create(
    projectID_id=123,
    # other_fields...
)

Как видите, поле ForeignKey автоматически создает еще один атрибут в модели, к которому добавлен _id (таким образом, у вас есть атрибуты projectID и projectID_id в вашей модели Release). Доступ к release_instance.projectID вернет экземпляр модели Project, а , а не ее идентификатор.

Это, вероятно, не так, как задумано, и я предполагаю, что было бы чище переименовать поле модели projectID в project.

0 голосов
/ 16 мая 2019

Попробуйте это

projectID=Project.objects.filter(pk=request.POST.get('projectID')).first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...