Как я могу перезаписать запись в models.py только в том случае, если id пользователя является текущим пользователем?
У меня есть файлы генома, и я хочу, чтобы каждый пользователь мог загрузить свой собственный файл генома, но он может иметь только один из них. Я хочу, чтобы если они попытаются загрузить другой, то он просто заменит геном и данные формы для их последней записи.
Я использую их записи, а также n количество людей, которые пользуются сайтом (у каждого человека также по 1 записи на человека) в качестве образцов для анализа генома этого человека, поэтому я хочу сохранить файл моделей, полный геномов, имен, пола и т.д... но только один на пользователя.
Вот мой файл models.py
from django.db import models
from django.core.exceptions import ObjectDoesNotExist
SEX_CHOICES = (
('M', 'Male'),
('F', 'Female')
)
class Genome(models.Model):
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=25)
CHOICES = [('M','Male'),('F','Female')]
sex = models.CharField(max_length=1, choices=SEX_CHOICES, default='M')
genome = models.FileField(upload_to='users/genomes/')
#id = request.user.id
#if id is the current user then replace old data with new data
def __str__(self):
return self.title
и вот моя функция представления
def upload(request):
context = {}
if request.method == 'POST':
form = GenomeForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('My-DNA.html')
else:
form = GenomeForm()
return render(request, 'my-DNA.html', {context})
else:
print("failure")
form = GenomeForm()
return render(request, 'Upload.html', {
'form': form
})
Мне просто нужен способ ограничить пользователя одним ответом и при этом иметь список многих геномов других людей для сравнения с ним.
Спасибо
Вы можете сделать это, добавив еще одно поле в модели.
class Genome(models.Model):
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=25)
CHOICES = [('M','Male'),('F','Female')]
sex = models.CharField(max_length=1, choices=SEX_CHOICES, default='M')
genome = models.FileField(upload_to='users/genomes/')
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user")
Здесь, добавляя пользователя как поле onetoOneField, один пользователь может создать только один геномный документ. Если вы хотите создать несколько геномных документов, вы можете использовать поле foreignKey. См. документ OneToOne: OnoToOne doc. Foreign Key doc: Foreign Key doc
Затем вы можете проверить в представлении, есть ли у пользователя геномный документ или нет. Если есть, то просто обновите или создайте новый геномный документ.
Вы можете проверить с помощью фильтрации в представлении:
Genome.objects.filter(user=user).first()
Здесь фильтр возвращает набор запросов и, вызывая first(), вы можете получить первый документ в этом наборе запросов или, если он не найден, просто вернуть none.