Как получить строковое значение вместо числа в поле внешнего ключа в 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 из таблицы Robot. вот код, как я присваиваю данные

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

Теперь я хочу показать эти данные в таблице в моем UI. Поэтому я написал следующее представление

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 %}

Но когда я получил данные, поле внешнего ключа отображается как id, а не как строка. enter image description here

но в моей админке django он приходит только как строка enter image description here

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

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

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

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

{{ hist.robotName__robot }}

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

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

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

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

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

<td>{{hist.robotName.robot}}</td>
Вернуться на верх