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

Результатом должно быть:

enter image description here

Но вместо этого он возвращает следующее:

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:

enter image description here

В других примерах, которые я видел, они использовали только 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')
Вернуться на верх