Как получить строковое значение вместо числа в поле внешнего ключа в 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, а не как строка.
но в моей админке django он приходит только как строка
как решить эту проблему?
Вы можете использовать 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>