0

如果有错误或误导,请用标题纠正我,谢谢。

我对 Django Python 很陌生。我正在使用 Django 3.1.1。

我的问题是关于"Model".objects.create(),我将它与 ajax 一起使用以在我的Logger模型中保存或创建数据。

问题:我怎样才能链接Logger.userprofileUserProfile.userusingLogger.objects.create()或者下一步要做什么来链接这两个字段?

我的UserProfile模型已经User通过 链接到模型,OneToOneField但正在使用 保存数据form.save(),这很成功。以下是我迄今为止通过遵循众多教程构建的内容。

这已经在工作,它正在我的模型中创建数据,我只需要添加 和 之间的链接,UserProfile以便Logger轻松识别创建的日志。

Logger通过二维码扫描在模型中创建日志。

视图.py

def processQRCode(request):

    if request.method == 'POST':
            qrcoderes = request.POST['qrcoderes']
            logged_in = request.POST['logged_in']
            logged_in_location = request.POST['logged_in_location']

            Logger.objects.create(
                qrcode_uuid = qrcoderes, #edited from qrcode_uuid to qrcoderes to distinguish the two variables.
                logged_in = logged_in,
                logged_in_location = logged_in_location 
            )

    return HttpResponse('Success!')

模型.py

用户档案模型

class UserProfile(models.Model):

    GENDER = (
        ('Male', 'Male'),
        ('Female', 'Female'),
    )

    user = models.OneToOneField(User, related_name='userprofile', null=True, on_delete=models.SET_NULL)

    qrcode_uuid = models.UUIDField(unique=True, default=uuid4)
    qr_code = models.ImageField(upload_to='qr_codes', blank=True)

    firstName = models.CharField(max_length=200)
    middleName = models.CharField(max_length=200)
    lastName = models.CharField(max_length=200)
    gender = models.CharField(max_length=6, choices=GENDER)
    birthdate = models.DateField(max_length=200)
    contact = models.CharField(max_length=200)
    agency = models.CharField(max_length=200) 
    deptSec = models.CharField(max_length=200)
    designation = models.CharField(max_length=200)
    streetHouse = models.CharField(max_length=200)
    purok = models.CharField(max_length=200)
    barangay = models.CharField(max_length=200)
    cityMunicipality = models.CharField(max_length=200)
    province = models.CharField(max_length=200)
    date_created = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'User Profile'

    def __str__(self):
        return self.firstName + " " + self.middleName + " " + self.lastName

    def save(self, *args, **kwargs):
        qrcode_img = qrcode.make(self.qrcode_uuid)
        canvas = Image.new('RGB', (370, 370), 'white')
        draw = ImageDraw.Draw(canvas)
        canvas.paste(qrcode_img)
        fileName = f'qr-code-{self.qrcode_uuid}.png'
        buffer = BytesIO()
        canvas.save(buffer,'PNG')
        self.qr_code.save(fileName, File(buffer), save=False)
        canvas.close()
        super().save(*args, **kwargs)

记录仪型号

class Logger(models.Model):
    userprofile = models.OneToOneField(UserProfile, null=True, on_delete=models.SET_NULL)

    qrcode_uuid = models.CharField(max_length=200, null=True)
    logged_in = models.CharField(max_length=1, default="1")
    logged_in_location = models.CharField(max_length=200, null=True)
    log_datetime = models.DateTimeField(auto_now_add=True)

    class Meta:
            verbose_name_plural = 'Logger'

    def __str__(self):
            return self.logged_in_location + " " + self.qrcode_uuid

Ajax.js

function processQRCodeDetails(){

$.ajax({
      type:'POST',
      url: '/processqrcode/',
      data:{
        qrcoderes: $('#process-qrcoderes').val(),
        logged_in: $('#logged_in').val(),
        logged_in_location: $('#logged_in_location').val(),
        csrfmiddlewaretoken: $('input[name="csrfmiddlewaretoken"]').val()
      },
      success: function(data){
        $('#staticBackdrop').modal();
        console.log('Success');
      },
      error: function(data){
        console.log('Error')
      }
    });

}

模板.html

<form id="process-qrcoderes-form">
  {% csrf_token %}
  <input class="form-control" type="text" name="process-qrcoderes" id="process-qrcoderes" onchange="processQRCodeDetails(); return false;" autofocus="autofocus">
  <input type="text" name="logged_in" id="logged_in" value="1">
  <input type="text" name="logged_in_location" id="logged_in_location" value="test">
</form>
4

2 回答 2

0

不小心解决了。

我不知道发生了什么,但是,不幸的是,当我扫描使用“保存并继续编辑”编辑的第三条记录时UUIDField,得到了在模型下编辑的记录(其中只有 3 条记录) UserProfiledjango 管理员,“它就像一个魅力!” (正如每个人在它工作时所说的那样:D),所以,我继续编辑其他 2 条记录,它也有效。

我的主要目标是使用以下语法将模型插入模型以链接 2 个id模型UserProfileLogger

# been trying this syntax for ages now. lol. and it was not the problem.
userprofile_id = UserProfile.objects.get(qrcode_uuid=qrcoderes) 

    #Note: Using the .objects.create() method also works now.
    log = Logger(
            userprofile = userprofile_id,
            qrcode_uuid = qrcoderes, #edited from qrcode_uuid to qrcoderes to distinguish the two variables.
            logged_in = logged_in,
            logged_in_location = logged_in_location
        )
    log.save()

注意:这不起作用,它给了我一个错误UserProfile matching query does not exist.,即使使用shell,它也给了我同样的错误。所以,我想,我的语法是问题所在,这就是我在这里发布我的问题的原因。

也许,我会尝试使用CharField.UUIDUUID

于 2020-09-30T05:05:50.397 回答
0

您需要从 db 获取 UserProfile 并将其传递给 create 方法

 def processQRCode(request):
    if request.method == 'POST':
        qrcode_uuid = request.POST['qrcoderes']
        logged_in = request.POST['logged_in']
        logged_in_location = request.POST['logged_in_location']

        # edit: you can get your UserProfile instance by "qrcode_uuid" as well
        # use get_or_create, note that it returns tuple, not instance
        userprofile, created = UserProfile.objects.get_or_create(qrcode_uuid=qrcode_uuid)
 
        if created:
            # some additional actions here for newly created UserProfile, filling some fields may be
            
            # recommended naming convention for class attrs in python is underscore_case, not camelCase
            userprofile.firstName = "John"
            userprofile.save()

        Logger.objects.create(
            qrcode_uuid = qrcode_uuid,
            logged_in = logged_in,
            logged_in_location = logged_in_location,
            userprofile=userprofile
        )

    return HttpResponse('Success!')
于 2020-09-25T13:21:53.913 回答