Невозможно объединить две таблицы по полю внешнего ключа с помощью 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 weapon
s 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')