Невозможно объединить две таблицы по полю внешнего ключа с помощью django ORM?
class weapons(models.Model):
weapon = models.CharField(max_length=11)
country = models.IntegerField()
flags = models.IntegerField(default=0)
title = models.CharField(max_length=1000)
class compare(models.Model):
weapon = models.CharField(max_length=11)
user_id = models.IntegerField()
flags = models.IntegerField(default=0)
WeaponNode = models.ForeignKey(weapons, on_delete=models.PROTECT)
Когда я запускаю эту функцию:
compare.objects.filter(user_id=1).values_list('weapon', 'WeaponNode__title')
Я ожидаю этот запрос в необработанном виде:
SELECT apps_compare.weapon, apps_weapons.title FROM apps_compare INNER JOIN apps_weapons ON (apps_compare.weapon = apps_weapons.weapon) WHERE apps_compare.user_id = 1
Результатом должно быть:
Но вместо этого он возвращает следующее:
SELECT "apps_compare"."weapon", "apps_weapons"."title" FROM "apps_compare" INNER JOIN "apps_weapons" ON ("apps_compare"."WeaponNode_id" = "apps_weapons"."id") WHERE "apps_compare"."user_id" = 1
apps_weapons.title возвращает null:
В других примерах, которые я видел, они использовали только id с JOIN ON, но я хочу использовать значение оружия вместо id. Как я могу сделать это с помощью ORM? Если это невозможно с помощью ORM, то каковы другие способы?
You are here using the ForeignKey the wrong way. If the weapon in your Compare model refers to weapons in the Weapon model, it should be unique, and then use that as a to_field=… [Django-doc]:
class Weapon(models.Model):
weapon = models.CharField(max_length=11, unique=True)
# …
class Compare(models.Model):
weapon = models.ForeignKey(
Weapon,
on_delete=models.CASCADE
to_field='weapon',
db_column='weapon'
)
# …
Тогда вы можете запросить:
Compare.objects.values('weapon', 'weapon__title')

