0

Я пытаюсь выяснить, как получить данные из моих моделей с отношениями ForeignKey. У меня есть следующий models.py:Python Django - Доступ к данным иностранных ключей

class wine(models.Model): 
    name = models.CharField(max_length=256) 
    year = models.CharField(max_length=4) 
    description = models.TextField() 

class collection(models.Model): 
    name = models.CharField(max_length=50) 
    description = models.TextField(null=True) 

class collection_detail(models.Model): 
    collection = models.ForeignKey(collection) 
    wine = models.ForeignKey(wine) 
    quantity = models.IntegerField() 
    price_paid = models.DecimalField(max_digits=5, decimal_places=2) 
    value = models.DecimalField(max_digits=5, decimal_places=2) 
    bottle_size = models.ForeignKey(bottle_size) 

Вино является основным стол, коллекция Деталь представляет собой таблицу, которая ссылается на вино и добавляет специальные пользовательские данные (например, цена, уплаченная) к нему. Коллекция представляет собой группу объектов collection_detail.

Я борюсь за доступ к данным в этих моделях. Я могу легко отображать данные из определенной модели, но при просмотре определенной коллекции я не могу получить доступ к данным collection_detail.wine.name. Нужно ли писать конкретные запросы для этого? Могу ли я получить доступ к этим данным с языка шаблонов? Моя модель данных кажется правильной при просмотре через администратора, я могу добавить данные и отношения, которые мне нужны.

Спасибо за помощь!

+0

В коллекции содержится много collection_detail. Таким образом, для доступа нет ни одной детали, кроме списка. Чтобы получить запрос в этом списке, используйте collection.collection_detail_set –

ответ

1

Используйте collection_detail_set, чтобы получить запрос на все collection_detail с этим collection.

Если вы хотите отношения один-к-одному, а не один-ко-многим (это то, что вы получаете с помощью ForeignKey), изменить

collection = models.ForeignKey(collection) 

в

collection = models.OneToOneField(collection) 

и доступ collectioncollection_detail просто позвонив по номеру collection_detail с вашей модели collection.

+0

Спасибо, ребята! Использование оболочки я попробовал следующее: mycollections = collection.objects.filter (пользователь = 1) # прибудет только коллекции моего пользователя MyCollection = mycollections.objects.filter (ID = 1) #grab первой коллекции но затем я запускаю в беду ... Я стараюсь: mydetails = mycollection.collection_detail_set.all() и я получаю сообщение об ошибке: AttributeError: объект 'QuerySet' не имеет атрибута 'collection_detail_set' Любые мысли? –

+0

Кроме того, мне кажется, мне нужны отношения от одного до многих, так как мне нужно иметь много объектов «collection_detail» на «коллекцию» правильно? –

+1

'.filter' возвращает QuerySet (набор экземпляров модели). Это полезно, если у вас есть несколько объектов с одним и тем же параметром (например, количество = 5). Это означает, что вы должны использовать 'mycollection = mycollections.objects.filter (id = 1) [0]'. Лучшим способом доступа к объектам по его первичному ключу является использование '.get', то есть' mycollection = mycollections.objects.get (pk = 1) '. Это вернет модельный подход вместо QueryObject. –

Смежные вопросы