Ошибка no such column при попытке получить данные в запросе raw() в Django
У меня есть следующие классы в моем models.py
class Users(models.Model):
username = models.CharField('User Name', null=False, max_length = 50)
password = models.CharField('User Password', max_length=50)
def __str__(self):
return self.username
class Photo(models.Model):
name = models.CharField(max_length=100, default="Image")
id = models.AutoField(primary_key=True)
uploader = models.ForeignKey(Users, default=None, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Photo_History(models.Model):
image = models.ImageField(upload_to="media/results")
upload_time = models.DateTimeField(auto_now_add=True, blank=True)
photo_id = models.ForeignKey(Photo, null=True, blank=True, on_delete=models.CASCADE)
Структура таблицы выглядит следующим образом,
Для класса Пользователи,
| username | password |
|---|---|
| abc | 123 |
| dec | 123 |
| john | 123 |
Для класса Фото,
| id | name | uploader (foreign key) |
|---|---|---|
| 1 | first | abc |
| 2 | second | abc |
| 3 | third | dec |
Для класса Фотоистория,
| image | upload_time | photo_id (foreign key) |
|---|---|---|
| img | 12-01-2022 | 1 |
| img | 12-03-2022 | 1 |
| img | 12-04-2022 | 3 |
| img | 12-05-2022 | 2 |
What I am trying to access is, a user is logged in. I need to get the Photo History Objects along with the "name" from the Photo model of the user who's currently logged in.
| name | img | upload_time |
|---|---|---|
| first | img | 12-01-2022 |
| first | img | 12-03-2022 |
| second | img | 12-05-2022 |
I tried to search a way to write a command using filter function to get this but I couldn't find any results that showed how you can get data from two different tables in a single query. And instead, people mentioned I should be using raw() query.
Так что я использовал необработанный запрос, который, как мне кажется, полностью подходит, но я получаю странную ошибку (которую вы получаете, если вы не сделали миграции, но мои миграции были сделаны давно, и столбец, для которого он показывает ошибку, я могу легко получить данные из него в других запросах)
.Это функция, которую я имею с запросом,
def history(request):
if request.session.has_key('is_logged'):
current_user_id= request.session['user_id']
q = "select p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader=%s;"
photos = Photo_History.objects.raw(q, [str(Users.objects.filter(username=current_user_id)[0])])
print("Photos: ", photos)
for p in photos:
print(p.name)
print(p.username)
print(p.upload_time)
return render(request, 'history.html', {'ID':current_user_id, 'photos':photos})
else:
return redirect('login')
Когда я пытаюсь запустить это, я получаю ошибку, которая
no such column: p.uploader
Может ли кто-нибудь сказать мне, в чем проблема и как я могу ее решить?
Здесь полная ошибка,
Просматривая документацию Django, я обнаружил, что Django добавляет _id в конце имени внешнего ключа.
Следовательно, я смог решить свою проблему, изменив p.uploader на p.uploader_id. Странная проблема, но именно так работают модели Django.
Заключительный вопрос был,
q = "select h.id, p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader_id=%s;"