Заполнение внешнего ключа в django
Я создаю страницу, которая позволяет только администратору добавлять некоторые активы. Каждый актив имеет тип. Я использовал выпадающий список для выбора типа актива. Выбранное значение asset_type передается в views.py, но я не могу записать его во вновь созданный объект asset. Вот мой models.py
class assetType(models.Model):
title = models.CharField(max_length=150)
@property
def get_type(self):
return asset.objects.filter(asset_type=self.id)
def __str__(self):
return f"{self.title}"
class Meta:
verbose_name_plural = 'Asset Types'
class asset(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, null=False)
asset_type = models.ForeignKey('assetType', on_delete=models.CASCADE, null=True)
asset_name = models.CharField(max_length=30, null=True) #unique=True
location = models.CharField(max_length=30, null=True)
brand = models.CharField(max_length=30, null=True)
purchase_year = models.PositiveIntegerField(blank=True, null=True)
isActive = models.BooleanField(default=True, null=True)
currentOwner = models.ForeignKey(User, default='', null=True, on_delete=models.CASCADE)
Вот createAssetView из views.py
@user_passes_test(lambda u: u.is_superuser)
def createAssetView(request):
assetTypeList = assetType.objects.all() # use assetType.title
assettype = request.POST.get('asset-type')
assetname = request.POST.get('asset-name')
locationn = request.POST.get('location')
brandd = request.POST.get('brand')
purchaseyear = request.POST.get('purchase-year')
isActivve = request.POST.get('is-active','') == 'on'
cuser=request.user
context={
"cuser":request.user,
"asset_type_list":assetTypeList,
"asset_type":assettype,
"asset_name":assetname,
"location":locationn,
"brand":brandd,
"purchase_year":purchaseyear,
"isActive":isActivve,
'iterator':range(2014,2050)
}
if request.method == 'POST':
new_asset = asset()
new_asset.asset_type_title=request.POST.get('asset-type')
new_asset.asset_name=assetname
new_asset.location=locationn
new_asset.brand=brandd
new_asset.purchase_year=purchaseyear
new_asset.isActive=True if isActivve else False
new_asset.currentOwner=cuser
print(assettype) # PRINT assettype
new_asset.save()
return redirect('createAssets')
return render(request, 'assets/createAsset.html', context)
Оператор PRINT assettype печатает выбранный тип актива из формы, поэтому значение передается в представление, как я должен заполнить им таблицу? Любые предложения или помощь будут высоко оценены. Спасибо!
new_asset.asset_type_title=request.POST.get('asset-type')
В этой строке и заключается ваша проблема. Вы не можете присвоить иностранный объект таким образом, он не будет автоматически искать соответствие в другой модели.
Вам необходимо предоставить либо объект, который будет использоваться в качестве внешнего ключа, либо первичный ключ объекта.
Итак, находим запись в базе данных для выбранного типа:
target_type = assetType.objects.get(title=assettype)
# this assumes you use unique titles for each assetType, see below
и затем предоставить новый актив либо вместе с самим объектом:
new_asset.asset_type = target_type
или его первичный ключ:
new_asset.asset_type_id = target_type.pk
Я настоятельно рекомендую потратить больше времени на изучение документации django, чтобы укрепить ваше понимание того, как в django реализована связь с иностранными объектами. По крайней мере, просмотрите учебники, которые посвящены этому.
Также рассмотрим следующее:
- Поле
title
моделиassetType
не ограничено быть уникальным. Что произойдет, если будут созданы два assetTypes с одинаковым названием? - Повторение
request.POST.get('asset-type')
.