Django Как проверить идентификатор ForeignKey?

У меня есть models.py следующего вида. который api_key в таблице UserKey является ForeignKey для api_key в таблице DeviceKey.

class DeviceKey(models.Model):
    
    api_key=models.CharField(max_length=100,unique=True)
    created=models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.api_key
   

class UserKey(models.Model):
    api_key=models.ForeignKey(DeviceKey,on_delete=models.CASCADE)

    def __str__(self):
        return self.username

Данные в таблице DeviceKey и Userkey выглядят следующим образом.

Table DeviceKey
id  api_key
1    abc1
2    abc2

Table Userkey
id  api_key_id
1     1

Я хочу проверить, существует ли api_key в таблице Userkey, но я не могу искать с помощью текста, потому что таблица UserKey хранит api_key как id. Поэтому я должен получить id из таблицы DeviceKey следующим образом

key="abc2"
if UserKey.objects.filter(username=username,api_key_id=DeviceKey.objects.get(api_key=key).values_list('id')).exists():

Выдает ошибку следующего вида.

'DeviceKey' object has no attribute 'values_list'

Как это исправить?

Это должно сработать, если ваш api_key в Device_key равен 'abc1'

   UserKey.objects.filter(api_key__api_key='abc1').exists()

При использовании внешнего ключа попробуйте использовать свойство related_name в таблице, которая имеет (много отношений).

class DeviceKey(models.Model):

    api_key=models.CharField(max_length=100,unique=True)
    created=models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.api_key


class UserKey(models.Model):
    api_key=models.ForeignKey(DeviceKey,on_delete=models.CASCADE, related_name='user_key')

    def __str__(self):
        return self.username

Если вы хотите получить записи 'api_key' модели 'DeviceKey' в реалтесте со строками модели 'UserKey'. Вы можете использовать 'realted_name' как показано ниже

api_key_obj = DeviceKey.objects.get(api_key='api_key_value')

Это дает список всех строк 'UserKey', которые находятся в отношениях с 'api_key_obj'. api_key_obj.user_key

Возвращает true или false в зависимости от существования связи между 'DeviceKey' и 'UserKey' для 'api_key_obj'.

api_key_obj.user_key.exists()

Это сработало для меня. Вы также можете попробовать следующее

UserKey.objects.filter(api_key__api_key='test').exists()

Вернуться на верх