通过Django模型中的数组/整数列表进行存储和排序

时间:2012-03-12 23:05:14

标签: django arrays sorting model integer

我有一个三个数字的矢量作为模型的名称。 即12-1-120 12-1-139 12-1-9等。

我想按降序对模型的实例进行排序,使用Django显示12-1-139,12-1-120,12-1-9。

除了它总是像字符串一样,因此显示12-1-9,12-1-139,12-1-120。

我尝试过使用'CommaSeparatedIntegerField',但它完全没用,而且行为方式仍然相同。

我所知道的唯一方法,即技术上的工作,是通过三个独立的“IntegerField”并按组合排序,我认为这太不切实际了。

任何指针,还是我坚持这种不切实际的方法?

我忘了提到我有时需要使用字符串来调用这个对象,我不想经常将字符串转换为int,所以我反过来做了它并将一堆int存入一个字符串使用一些计算字段。

这是我的基本代码:

class MyModelName(models.Model):
    name = models.CharField(max_length=15)
    x = models.IntegerField(max_length=200)
    y = models.IntegerField(max_length=200)
    z = models.IntegerField(max_length=200)

    def save(self, *args, **kwargs):
        self.name = '-'.join([str(self.x), str(self.y), str(self.z)])
        super(MyModelName, self).save(*args, **kwargs)

    class Meta:
        ordering = ["-x","-y","-z"]

1 个答案:

答案 0 :(得分:2)

可以使用三个整数字段。

如果您想以这种方式命名对象,可以随时在模型中添加 unicode 函数...

class Thing(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()
    z = models.IntegerField()

    def __unicode__(self):
        """
            Return a human-readable representation of the object.
        """
        return '-'.join(self.x, self.y, self.z)

https://docs.djangoproject.com/en/dev/ref/models/instances/#unicode

get_or_create示例:

s = '12-1-9'
x, y, z = [int(c) for c in s.split('-')]
thing, created = Thing.objects.get_or_create(x=x, y=y, z=z)

自定义获取或创建方法

class ThingManager(models.Manager):

    def from_string(s):
        x, y, z = [int(c) for c in s.split('-')]
        obj, created = self.get_or_create(x=x, y=y, z=z)
        return obj, created


class Thing(models.Model):
    objects = ThingManager()
    # Snip


--


my_new_thing, created = Thing.objects.from_string('12-1-9')