#python #django
Вопрос:
Я могу быть сбит с толку , однако, когда я проверяю панель администратора django, которую я вижу (предоставлю скриншот), более 50 моделей, прикрепленных к моей основной модели, однако всякий раз, когда я делаю запрос в коде и пытаюсь получить доступ к набору, связанному с полем, я получаю только одну запись. Я пытаюсь сделать один запрос и проверить все модели, связанные с полем.
Мои модели.py-код:
class TokenData(models.Model):
name = models.CharField(max_length=200)
contract_address = models.CharField(max_length=200,primary_key=True, unique=True)
def save(self, *args, **kwargs):
#print('save() is called.')
super(TokenData, self).save(*args, **kwargs)
def __str__(self):
return self.name
class WalletData(models.Model):
address = models.CharField(max_length=200,primary_key=True,unique=True)
contract_address = models.ForeignKey(to=TokenData,on_delete=models.CASCADE,)
last_bitquery_scan = models.CharField(max_length=200)
def __str__(self):
return self.address
Я пытаюсь получить доступ к модели следующим образом :
WalletData.objects.filter(address=address)
Я заметил одну вещь: когда я создаю переменную, содержащую фильтр, и получаю доступ к адресу contract_address в модели WalletData, я могу бесконечно запрашивать себя по кругу за неимением лучшего слова, получая доступ к набору и выполняя get против него.
Я просто хочу получить доступ ко всем 50 моделям, как показано ниже
Комментарии:
1. ты имеешь в виду
WalletData.objects.filter(contract_address=address)
?2. На самом деле нет, так что это немного сбивает с толку, но то, как он назван, намеренно. Api, который я создаю, доступен из интерфейса, где известен адрес кошелька (адрес), он сохраняется и используется для запроса различных сторонних API. Таким образом, объект WalletData фильтруется по адресу кошелька и должен отвечать всеми объектами WalletData.contract_address, связанными с самим адресом, однако, хотя на изображении вы можете видеть более 50 объектов, в самом коде я вижу только один, например, питбуля
Ответ №1:
Более 50 объектов, которые вы видите в раскрывающемся списке, — это просто все объекты TokenData в базе данных, перечисленные по имени.
Из того, что я могу понять, вам нужны все токендаты, связанные с конкретным адресом WalletData, если это так, то для объекта w
WalletData вы можете сделать
TokenData.objects.filter(contact_address = w.contact_address).values_list('name',flat=True)
Это дает вам все имя TokenData, связанное с адресом WalletData.
Комментарии:
1. Так что это тоже не сработало. Я сохранил модели, создав модель токена для каждого токена и прикрепив ее к модели кошелька, которая была создана с адресом. Я в основном пытаюсь составить список контрактов, которые доступны в кошельке, может быть, я неправильно использовал свои модели для этого?
Ответ №2:
В конце концов я понял, что это было мое решение:
Models.py
class TokenData(models.Model):
name = models.CharField(max_length=200)
contract_address = models.CharField(max_length=200,primary_key=True, unique=True)
def save(self, *args, **kwargs):
#print('save() is called.')
super(TokenData, self).save(*args, **kwargs)
def __str__(self):
return self.name
class WalletData(models.Model):
address = models.CharField(max_length=200,primary_key=True,unique=True)
#contract_address = models.ForeignKey(to=TokenData,on_delete=models.CASCADE,)
last_bitquery_scan = models.CharField(max_length=200)
def __str__(self):
return self.address
class WalletHolding(models.Model):
token = models.ForeignKey(to=TokenData,on_delete=CASCADE)
wallet = models.ForeignKey(to=WalletData,on_delete=CASCADE)
def __str__(self):
return self.token
Мне пришлось добавить другую модель, т. е. хранение кошелька, таким образом, когда я запрашиваю хранение кошелька по полю кошелька, я получаю все токены, связанные с кошельком, с помощью запроса, подобного этому:
WalletHolding.objects.filter(wallet=address).values_list('token',flat=True)
Результат: