【问题标题】:How to replace certain values in a queryset with Django?如何用 Django 替换查询集中的某些值?
【发布时间】:2014-10-14 08:01:52
【问题描述】:

我有这两种型号:

class Rfid(models.Model):
    id = models.IntegerField(primary_key=True)
    tag_id = models.CharField(db_column='Tag_ID', max_length=16, blank=True) # Field name made$
    site_id = models.CharField(db_column='Site_ID', max_length=8, blank=True) # Field name mad$
    time = models.IntegerField(db_column='Time', blank=True, null=True) # Field name made lowe$
    class Meta:
        managed = False
        db_table = 'RFID'

class RfidNames(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=24, blank=True)
    badge_id = models.CharField(max_length=16, blank=True)
    class Meta:
        managed = False
        db_table = 'RFID_names'

在视图中我有这个:

def rfid_lister(request):
    raw_scans = Rfid.objects.all().using('devices').order_by('-time')
    rfid_scan_list = list(raw_scans )

    return render_to_response("RFID_display.html",
                              locals(),
                              context_instance=RequestContext(request))

在我的模板中,我只显示来自 raw_scan 的数据,如下所示:

A11     8400340910  8/20/2014 15:37:22
A11     8400340910  8/20/2014 13:55:10
A11     8400340910  8/20/2014 13:51:53
A11     8400340910  8/20/2014 13:43:33
A11     35021E05AE  8/20/2014 13:39:58
A11     0500679CF9  8/20/2014 13:39:26
A11     0500679CF9  8/20/2014 13:39:24 

但是在 RfidNames 表中我有这样的东西:

name=bob, badge_id=8400340910

我正在寻找的是一种呈现如下内容的方法:

A11     bob         8/20/2014 15:37:22
A11     bob         8/20/2014 13:55:10
A11     bob         8/20/2014 13:51:53
A11     bob         8/20/2014 13:43:33
A11     35021E05AE  8/20/2014 13:39:58
A11     0500679CF9  8/20/2014 13:39:26
A11     0500679CF9  8/20/2014 13:39:24 

关于如何使用查询集完成此操作的任何想法?

谢谢

【问题讨论】:

    标签: mysql django join django-queryset


    【解决方案1】:

    看来,Rfid.tag_id 确实是 RfidNames.badge_id 的外键。您应该这样声明:外键字段可以很容易地成为字符字段。

    class Rfid(models.Model):
        ...
        tag = models.ForeignKey('RfidNames', db_column='Tag_ID', to_field='badge_id', blank=True, null=True)
    

    现在您可以简单地遵循模板中的关系:

    {% for scan in scan_list %}
        {{ scan.site_id }}  {{ scan.tag.name }}  {{ scan.time }}
    {% endfor %}
    

    这会导致每行进行一次数据库查找,因此您可以在视图中使用 select_related 以显着提高效率:

    scan_list = Rfid.objects.all().using('devices').order_by('-time').select_related('RfidNames')
    

    请注意,在任何情况下,您都不需要转换为列表的显式步骤。

    【讨论】:

    • 效果非常好!作为其他人的参考,我必须在模板中添加一个比较 {% if obj.tag.name %} 以查看 obj.tag.name 是否为 null 并插入 obj.tag_id 如果是,但这给了我一点无论如何都要有更多的控制权,所以谢谢!
    • 没问题。如果它对您有帮助,请不要忘记接受答案:它向未来的用户表明它解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2015-04-24
    • 2020-09-28
    • 2018-04-15
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多