【问题标题】:How can I overwrite a models.py entry only if the user id is the current user?仅当用户 ID 是当前用户时,如何覆盖 models.py 条目?
【发布时间】:2022-01-27 06:08:02
【问题描述】:

我有基因组文件,我希望每个用户都能够上传他们自己的基因组文件,但他们只能拥有其中一个。我想要这样,如果他们尝试上传另一个,那么他们只会替换基因组并为最后一个条目形成数据。

我正在使用他们的条目以及使用该网站的 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
        })

我只是想要一种方法来将用户限制为一个响应,同时仍然拥有来自其他人的许多基因组列表来进行比较。

谢谢

【问题讨论】:

  • 为什么不能用这么简单的视图更新文件
  • 谢谢,我该怎么做?这似乎可行。如何在更新之前检查那里是否有数据?

标签: python django django-models django-views userid


【解决方案1】:

您可以通过在模型中添加另一个字段来做到这一点。

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

然后您可以查看用户是否有基因组文档。 如果有则只需更新或创建新的基因组文件。

您可以通过在视图中过滤来检查:

Genome.objects.filter(user=user).first()

这里过滤器返回一个查询集,通过调用 first(),您可以获得该查询集中的第一个文档,或者如果没有找到,则直接返回无。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多