Django моделирует множество к одному, не имея возможности получить доступ ко всем объектам в поле внешнего ключа

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

Результат:

введите описание изображения здесь