【问题标题】:Django "Model.objects.create()" linking two fields/relationshipDjango“Model.objects.create()”链接两个字段/关系
【发布时间】:2020-09-25 05:49:27
【问题描述】:

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

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

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

问题:如何使用Logger.objects.create()Logger.userprofile 链接到UserProfile.user,或者接下来要如何链接这两个字段?

我的UserProfile 模型已经通过OneToOneField 链接到User 模型,但正在使用form.save() 保存数据,并且这很成功。以下是我到目前为止通过大量教程构建的内容。

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

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

Views.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!')

Models.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')
      }
    });

}

template.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>

【问题讨论】:

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


    【解决方案1】:

    您需要从 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!')
    

    【讨论】:

    • 感谢您的回复,logged_in 是您登录到特定位置,就像您在其中以个人身份书写信息的手动日志。系统登录认证中不使用logged_in。 :)
    • 这也意味着request.user不是应用程序,因为用户实际上并没有登录系统。
    • 我想要实现的是记录所有通过 qrcode 扫描仪扫描的 qrcode_uuid 并将Logger,userprofileqrcode_uuid 链接到UserProfile 模型以通过不只是查看来轻松识别日志`uuid` 但带有UserProfile 之类的全名。 :)
    • 感谢您的回复,已经这样做了,但收到错误qrcodemonsys.models.UserProfile.DoesNotExist: UserProfile matching query does not exist. 我是 Django 的新手,抱歉。 :)
    • 新编辑将在UserProfle 模型中添加/创建新数据,而不是在Logger 模型中。
    【解决方案2】:

    不小心解决了。

    我不知道UUIDField 发生了什么事,但是,不幸的是,当我扫描第三条记录时,得到了一条在UserProfile 模型下编辑的记录(其中只有 3 条记录)使用 django admin 的“保存并继续编辑”进行编辑,“它就像一个魅力!” (当它工作时,每个人都这么称呼它:D),所以,我继续编辑其他 2 条记录,它也工作了。

    我的主要目标是将UserProfile 模型的id 插入Logger 模型以使用以下语法链接这两个模型:

    # 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 用于UUID,如果这会有所不同或者它与UUID 兼容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 2016-06-09
      相关资源
      最近更新 更多