Django-как получить себя.id при сохранении нового объекта?

у меня проблема в одной из моих моделей. Я загружаю изображение, и я хочу сохранить id (pk в таблице базы данных), но мне нужно знать, в какой момент у Django будет доступ к self.id.

models.py

class BicycleAdItemKind(MPTTModel):
    def url(self, filename):
        pdb.set_trace()

        url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename)
        return url

    def item_kind_image(self):
        return '<img align="middle" src="/media/%s" height="60px" />' % self.image
    item_kind_image.allow_tags = True     

    # Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista
    n_item_kind      = models.CharField(max_length=50) 
    parent           = TreeForeignKey('self', null=True,
                                      blank=True, related_name='children')
    description      = models.TextField(null=True, blank=True)
    image            = models.ImageField(upload_to=url, null=True, blank=True)
    date_inserted    = models.DateTimeField(auto_now_add=True)
    date_last_update = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.n_item_kind

    class MPTTMeta:
        order_insertion_by = ['n_item_kind']

проблема в url() метод; я могу только получить self.id при обновлении объекта, я не получу self.id при создании нового объекта. Как я могу изменить эту модель, чтобы получить self.id при создании нового объект?

с текущим кодом, когда я создаю новый объект, я получу url-адрес, например:

MultimediaData/HelpAdImages/ItemKind/None/somefile.jpg

и мне нужно что-то вроде:

MultimediaData/HelpAdImages/ItemKind/35/somefile.jpg

какие-то зацепки?

5 ответов


Если это новый объект, вам нужно сначала сохранить его, а затем получить доступ к себе.id, потому что

"There's no way to tell what the value of an ID will be before you call save(), 
 because that value is calculated by your database, not by Django."

Проверьте документ django https://docs.djangoproject.com/en/dev/ref/models/instances/


вам может потребоваться сохранить этот файл / экземпляр дважды:

вы можете использовать сигнал post_save на модели, которая ищет созданный флаг, и повторно сохраняет экземпляр, обновляя url (и перемещая/переименовывая файл по мере необходимости), так как экземпляр теперь будет иметь идентификатор. Убедитесь, что вы делаете это только при условии создания, хотя, в противном случае вы будете постоянно цикл в сохранении: сохранение стартует сигнал после сохранения, который делает сохранение, которое стартует после сохранения сигнал...

см.https://docs.djangoproject.com/en/dev/ref/signals/#post-save


Примечание: Вы должны иметь models.AutoField(primary_key=True) набор атрибутов, иначе база данных будет обновлена с новым идентификатором, но Django не распознает его.

models.AutoField(primary_key=True)

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

Views.py

    #Queries model and appends id's to list
    try:
        qs = YourModel.objects.all()
        qslist = []

        for item in qs:
            qslist.append(item.id)

        newid = int(max(qslist) + 1)
    #If no entries are found, assume this is the first entry.
    except:
        newid = 1

однако я не уверен, насколько хорошо это будет работать на больших DBs.


  q = Order.objects.values_list('id', flat=True).order_by('-id')[:1]
            if len(q):
                self.number = str(self.id) if self.id else str(int(q.get()) + 1)
            else:
                self.number = 1