Проблема с пользовательским первичным ключом в Django - PullRequest
0 голосов
/ 30 марта 2011

В следующей модели (Item) моя цель - явно указать настроенный идентификатор объекта при сохранении.Я использую Django 1.2.5 и sqlite.

class Category(models.Model):
    name = models.CharField(max_length=32)

class Item(models.Model):
    id = models.CharField(primary_key=True, blank=True, max_length=8)
    group = models.ForeignKey(Category)

    def save(self, *args, **kwargs):
        self.id = "%s-%s" % (self.group.id, self.group.item_set.count() + 1)
        super(Item, self).save(*args, **kwargs)

У меня есть проблема с использованием интерфейса администратора для модели Item, когда я собираюсь сохранить объект, который уже существует, вместо обновлениясуществующая запись новая запись создана.Я пытался принудительно выполнить обновление, когда это необходимо, с помощью этого кода

def save(self, *args, **kwargs):
    update = bool(self.id)
    self.id = "%s-%s" % (self.group.id, self.group.item_set.count() + 1)
    super(Item, self).save(force_update=update, *args, **kwargs)

, но безуспешно.Теперь сохранение после изменения вызывает другую проблему:

DatabaseError at /admin/type/catalog/1_3/

Forced update did not affect any rows.

Я хотел бы знать, что я делаю неправильно, и если есть способ решить проблему.

Спасибо

- РЕДАКТИРОВАТЬ - (нужна дополнительная помощь!)

Вариант использования.

Я хочу получить, что при выборе категории толькоэлементы, принадлежащие к этой категории, отображаются в поле выбора элементов.

По этой причине мне нужно связать каждый элемент с соответствующей категорией с помощью поля id, чтобы категории и элементы в интерфейсе администратора, если они вместена той же странице, будут связаны их идентификатором (и, следовательно, легко обрабатываются с помощью jQuery).Таким образом:

<select id="id_category" name="category">
  <option value="1">color</option>
  <option value="2">car</option>
</select>

<select id="id_item" name="item">
  <option value="1_1">red</option>
  <option value="1_2">blue</option>
  <option value="2_1">audi</option>
</select>

Если бы я использовал другое поле, кроме id, выпадающий список в admin был бы совершенно не связан в respecet, если их идентификатор, потому что выбор элемента будет:

  <option value="1">red</option>
  <option value="2">blue</option>
  <option value="3">audi</option>

HopeЯ был достаточно ясен!

1 Ответ

1 голос
/ 30 марта 2011

Это не прямой ответ на ваш вопрос, но вы можете оставить поле id и вместо этого добавить поле category_id.

from django.db.models import Max

class Category(models.Model):
    name = models.CharField(max_length=32)

class Item(models.Model):
    cat_id = models.IntegerField(editable=False, blank=True, null=True)
    group = models.ForeignKey(Category)

    class Meta:
        unique_together = ('cat_id', 'group')

    def save(self, *args, **kwargs):
        self.cat_id = Items.objects.filter(group=self.group).aggregate(Max('cat_id'))['cat_id__max']+1
        super(Item, self).save(*args, **kwargs)
...