【问题标题】:Save multiple values in one field (Django)在一个字段中保存多个值(Django)
【发布时间】:2020-10-22 12:39:54
【问题描述】:

问题:

我有一个模型,它引用了 django 的基本用户模型。现在,如果我提交表单,Django 会通过用新数据替换现有数据来更新我的数据库。我希望能够访问它们。 (在重量和日期字段中)

模型文件:

我在这里看到了其他帖子,他们通过指定外键解决了一个问题,但这并没有为我解决问题。

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
# Create your models here.
class Profile(models.Model):
      user = models.ForeignKey(User, on_delete=models.CASCADE)
      weight = models.FloatField(max_length=20, blank=True, null=True)
      height = models.FloatField(max_length=20, blank=True, null=True)
      date = models.DateField(auto_now_add=True)
      def __str__(self):
          return self.user.username

      @receiver(post_save, sender=User)
      def save_user_profile(sender, instance, created, **kwargs):
      if created:
      Profile.objects.create(user=instance)

查看文件:

这是我保存从名为 WeightForm 的表单中获取的数据的地方

from django.shortcuts import render
from django.contrib.auth.models import User
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from users import models
from users.models import Profile
from .forms import WeightForm

def home(request):
    form = WeightForm()
    if request.is_ajax():
       profile = get_object_or_404(Profile, id = request.user.id)
       form = WeightForm(request.POST, instance=profile)
       if form.is_valid():
          form.save()
          return JsonResponse({
            'msg': 'Success'
        })
       
    
return render(request, 'Landing/index.html',{'form':form})

我尝试了什么:

我曾经与这个模型有一个 OneToOneField 关系,但正如你所见,根据我在这个网站上看到的答案,我将其更改为外键。

谢谢你在我的混乱中走到这一步:D

【问题讨论】:

  • 我无法理解“我希望能够同时访问它们。(在重量和日期字段中)
  • 好吧,我希望能够为单个用户存储多个值。就像他可以有 10 个重量值等等
  • 我已经编辑了我的答案,请看一下

标签: python django model


【解决方案1】:

我不完全理解您所说的“我希望能够访问它们。(在体重和日期字段中)”的意思,但我想您希望用户能够看到他们以前的体重数据和日期也是,所以你可以尝试这样做:

在你的 models.py 中尝试这样做,

class Profile(models.Model):
      user_id = models.AutoField(primary_key=True)
      user = models.ForeignKey(User, on_delete=models.CASCADE)
      height = models.FloatField(max_length=20, blank=True, null=True)
      def __str__(self):
          return self.user.username

class UserData(models.Model):
      Data_id = models.AutoField(primary_key=True)
      user_id = models.ForeignKey(Profile, on_delete=models.CASCADE)
      weight = models.FloatField(max_length=20, blank=True, null=True)
      date = models.DateField(auto_now_add=True)

那么你可以为这两个模型使用单独的表格并将它们组合使用。

【讨论】:

    【解决方案2】:

    你可以做一个解决方法

    1. 创建包含“版本”之类的新模型

    2. 使用外键引用版本

       class ProfileChange(models.Model):
           Date = models.DateField(default=datetime.datetime.today().strftime('%Y-%m-%d'))
      
            @classmethod
            def create(cls):
               object = cls()
               return object
      
      
       class Profile(models.Model):
           version = models.ForeignKey(ProfileChange,on_delete=models.CASCADE)
      

    不幸的是,您每天只能看到一个 ProfileChange。如果你想看到更多,而不是models.DataField 使用models.IntegerField

    【讨论】:

    • 好吧,我试了一下,但它做同样的事情。替换数据库中的现有值
    • 你能试试新的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 2011-09-23
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多