自上次使用Django和Python登录以来,如何获得新的数据库更改?

时间:2017-09-18 17:05:21

标签: django python-3.x

我需要为用户进行数据库更改,但只需要自上次登录以来用户的更新。我将只传入一封电子邮件。我查看了会话数据,但这些对我来说都没什么用。我是Python和Django的新手,我不知道从哪里开始,任何帮助都将不胜感激。这是我的模特:

class Device(models.Model):
  serial = models.CharField(max_length=16, null=False, unique=True)
  publickey = models.CharField(max_length=44, null=False)

  def __str__(self):
    return '%d: %s' % (self.id, self.serial)

class Pairing(models.Model):
  device = models.OneToOneField(Device,on_delete=models.PROTECT,blank=False, null=False)
  pairingcode = models.CharField(max_length=10, blank=False, null=False, unique=True)

  def __str__(self):
    return '%s: %s' % (self.device_id, self.pairingcode)

class UserDevice(models.Model):
  user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, 
null=False)
  device = models.ForeignKey(Device, on_delete=models.PROTECT, null=False)
  activation_date = models.DateTimeField(default=timezone.now, null=False)
  friendly_name = models.CharField(max_length=20, null=True, blank=True)
  is_owner = models.BooleanField(null=False, default=False)
  is_admin = models.BooleanField(null=False, default=True)
  is_alerts_enabled = models.BooleanField(null=False, default=True)

  class Meta:
    unique_together = ('user', 'device',)

  def __str__(self):
    return '%s => %s on %s' % (self.user.email, self.device.serial, 
  str(self.activation_date))

class Schedule(models.Model):
  device = models.ForeignKey(Device, on_delete=models.PROTECT, null=False)
  time = models.TimeField(null=False)

  class Meta:
    unique_together = ('device', 'time')

class PendingSchedule(models.Model):
  device = models.ForeignKey(Device, on_delete=models.PROTECT, null=False)
  user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT, null=False)
  time = models.TimeField(null=False)

  class Meta:
    unique_together = ('device', 'time')

class Tray(models.Model):
  device = models.ForeignKey(Device, on_delete=models.PROTECT, null=False)
  slot = models.IntegerField(null=False)
  full = models.BooleanField(null=False)
  time = models.DateTimeField(null=False)

  class Meta:
    unique_together = (('device', 'slot'), ('device', 'time'))

  def __str__(self):
    return 'Cup %s of %s %s' % (self.slot, str(self.device), "Full" if 
  self.full else "Empty")

class TrayStatus(models.Model):
  device = models.ForeignKey(Device, on_delete=models.PROTECT, null=False)
  slot = models.IntegerField(null=False)
  reason = models.TextField(blank=False, null=False)
  time = models.DateTimeField(null=False)
  recorded = models.DateTimeField(auto_now_add=True, null=False)
  expectedTime = models.DateTimeField(null=False)

class CheckIn(models.Model):
  device = models.OneToOneField(Device, on_delete=models.PROTECT, null=False)
  time = models.DateTimeField(null=False)


class UserProfile(models.Model):
  user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT, null=False)
  token = models.TextField(null=False, blank=True)
  first_name = models.TextField(null=True, blank=True)
  last_name = models.TextField(null=True, blank=True)

2 个答案:

答案 0 :(得分:5)

您在任何相关型号上都没有last_modified个字段,请从那里开始:

class UserDevice(models.Model):
   # other fields...
   created = models.DateTimeField(autonow_add=True, db_index=True)
   last_modified = models.DateTimeField(autonow=True, db_index=True)

这些将自动填充并且不会出现在模型表单中(可编辑强制为False)。对于要跟踪更改的每个模型,您需要添加last_modified字段和可选的已创建字段。

现在您可以根据User.last_login获取对象:

# Get our user object based on email
user = User.objects.get(email=email)
# Get list of modified devices
modified_devices = UserDevice.objects.filter(last_modified__gte=user.last_login)
# ... and trays
modified_trays = Tray.objects.filter(last_modified__gte=user.last_login)

如果更改了链接到它的托盘,设备将不会更改,因此设备的last_modified字段也不会更改。

如果您愿意,创建的字段用于显示修改和创建之间的区别:

new_devices = UserDevice.objects.filter(created__gte=user.last_login)

您面临的挑战,如果如何处理设备的所有权更改。您可能需要单独跟踪它。

答案 1 :(得分:0)

有几个第三方软件包允许您执行所需操作,例如django audit logdjango reversion

您只需挑选一个更符合您需求的产品,它们都非常易于集成和使用。