Проблема с возвратом данных в шаблонах django
Так что я работаю над небольшим проектом django и у меня проблема с внешним ключом. У меня есть модель с 2 таблицами mymodel1 и mymodel2.
#Models.py
class Mymodel1(moels.Model):
name = models.CharField(max_length=20)
blurb = models.CharField(max_length=20)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Mymodel2(moels.Model):
name = models.ForeignKey(Mymdoel1, on_delete=models.CASCADE)
somethingelse = models.CharField(max_length=20)
В моих запросах передается id из Mymodel1, и мой шаблон возвращает данные, но я также хочу, чтобы шаблон возвращал данные из моей модели2
def get_details(request ,id):
if User.is_authenticated:
try:
single_record = Mymodle1.objects.get(id=id)
details = Mymodel2.objects.get(id=single_record.name)
except Exception as e:
raise e
context = {
'single_asset': single_asset,
'details': details,
}
return render(request, 'detail.html', context=context)
else:
return render(request, 'home.html')
но я не могу заставить представление возвращать детали.
Как мы заметили в комментариях, здесь вы неправильно назвали свой запрос details
:
details = Mymodel2.objects.get(id=single_record.name)
Причина в том, что вы запрашивали id
модели (которая почти в каждом случае является числом, int, big int и т.д...) с атрибутом имени записи. То есть id=single_record.name
это не может работать.
Чтобы исправить это, вы можете посмотреть на имена отношений вашей модели FK
для атрибутов между Mymodel1
и Mymodel2
. В этом случае, если вы вызовете ваш размещенный single_record
, вы увидите:
single_record = Mymodle1.objects.get(id=id)
Поскольку в Mymodel1
есть attr name
в Mymodel2
для отношений FK
, вы можете найти их, изменив запрос details
следующим образом:
details = Mymodel2.objects.get(name=single_record)
Или если вы хотите использовать id
(при условии, что ваш пк называется id
):
details = Mymodel2.objects.get(name__id=single_record.pk)
Или вы можете использовать обратные отношения для Mymodel1
к Mymodel2
. Django по умолчанию дает вам related_name в качестве ModelName, ниже, за которым следует _set, поэтому, поскольку у вас нет related name, вы можете сделать:
details = single_record.mymodel2_set.all()