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()