Как получить строковое значение вместо числа в поле внешнего ключа в django?

#python #django

Вопрос:

Вот мои модели

 class Robot(models.Model):
    robot = models.CharField(max_length=100)
    short_Description = models.CharField(max_length=200)
    status = models.CharField(max_length=20)
    parameter = models.CharField(max_length=200)
    jenkins_job = models.CharField(max_length=100, default='JenkinsJobName')
    jenkins_token = models.CharField(max_length=100, default='JenkinsToken')
    jenkins_build = models.CharField(max_length=10, default=0)
    jenkins_build_status = models.CharField(max_length=20, default="Never Run")
    def __str__(self):
        return self.robot


class jenkinsHistory(models.Model):
    robotName = models.ForeignKey(Robot, on_delete=models.CASCADE, blank=True, null=True)
    jenkinsBuildNumber = models.CharField(max_length=100,blank=True)
    jenkinsBuildStatus = models.CharField(max_length=200,blank=True)
    errorMsg = models.CharField(max_length=500,blank=True)
    Param = models.CharField(max_length=500,blank=True, null=True)
    def __str__(self):
        return self.robotName
 

Я назначил данные в таблице jenkinsHistory из таблицы роботов. вот код, которым я назначаю данные

 def Run_data(Request,id):
    if Request.method == 'POST':
        pi = Robot.objects.get(pk=id)
        hist = jenkinsHistory(robotName= pi,jenkinsBuildStatus='Jenkins-Running')
        hist.save()
 

теперь я хочу показать эти данные в таблице в своем пользовательском интерфейсе. так что я написал этот взгляд

 def Robot_History(Request,id):
    fm = list(jenkinsHistory.objects.values('id','robotName','jenkinsBuildNumber','jenkinsBuildStatus','errorMsg','Param').filter(robotName=id))
    print("hello",fm)
    rob = Robot.objects.all()
    return render(Request, 'hello/robotHistory.html',{'jenkinsHistory': fm,'robot': rob})
 

и вот мой html

 {% for hist in jenkinsHistory %}
                <tbody>
                    <tr>
                        <td>{{hist.id}}</td>
                        <td>{{hist.robotName}}</td>
                        <td>{{hist.jenkinsBuildNumber}}</td>
                        <td>{{hist.jenkinsBuildStatus}}</td>
                        <td>{{hist.errorMsg}}</td>
                        <td>{{hist.Param}}</td>
                    </tr>
                </tbody>
                {% endfor %}
 

Но когда я получил данные, поле внешнего ключа появилось в виде идентификатора, а не строки
введите описание изображения здесь

но в моем администраторе django он поставляется только в виде строки введите описание изображения здесь

как решить эту проблему?

Ответ №1:

Вы можете использовать robotName__robot в своем values звонке:

 jenkinsHistory.objects.values(..., 'robotName__robot',...)
 

и используйте это же поле в своем шаблоне:

 {{ hist.robotName__robot }}
 

Занимаясь этим, я предлагаю вам изменить jenkinsHistory robotName поле » s » на «просто robot «, поскольку это относится к внешнему ключу (или Robot объекту), а не только к имени. Это поможет сделать ваш код менее запутанным и более читабельным.

Ответ №2:

Как robotName и в случае с FK для robot моделирования, когда вы получаете это через values() , queryset возвращает вам «робота». Затем вы передаете этот robot объект в шаблон yout с robotName именем.

Поэтому, когда вы пытаетесь отобразить robotName в шаблоне, он показывает вам, что это попытка id robotName__robot :

 jenkinsHistory.objects.values(..., 'robotName__robot',...)
 

Или вы можете сделать это в своем шаблоне:

 <td>{{hist.robotName.robot}}</td>