Заполнение внешнего ключа в 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')
  • .
Вернуться на верх