Хранение и упорядочение по массиву / списку целых чисел в модели Django - PullRequest
0 голосов
/ 13 марта 2012

У меня есть вектор из трех чисел в качестве имени для модели. то есть 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, поэтому я сделал это наоборот и сохранил кучу целых чисел в строку используя несколько вычисляемых полей.

Вот мой основной код:

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 Ответ

2 голосов
/ 13 марта 2012

Три целых поля - путь.

Если вы хотите назвать свои объекты таким образом, вы всегда можете добавить юникод функцию к вашей модели ...

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)

пользовательский метод get или create

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