Как я могу перезаписать запись в 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.

Вернуться на верх