Я довольно новичок в Django, и это поставило меня в тупик.

Я работаю над инструментом планирования и пока имею две модели:

#----------------------------------------------------------------------------------

class ReccurenceEvent(models.Model):
    """
    A recurrence event defined an event which recurses over a period of time. The pattern of the recursion
    is defined within the rec_type attribute.
    """
    event_id = models.IntegerField(primary_key=True)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    text = models.CharField(max_length=30)
    rec_type = models.CharField(max_length=32)
    event_length = models.BigIntegerField(null=True)

#----------------------------------------------------------------------------------

class Event(models.Model):
    """
    A an event represents an independent calender event. 
    If the event relates to a series, the p_id points to a particular ReccurencePattern
    """
    event_id = models.IntegerField(primary_key=True)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    text = models.CharField(max_length=30)
    rec_type = models.CharField(max_length=32)
    event_length = models.BigIntegerField(null=True)

    event_pid = models.ForeignKey(ReccurenceEvent, null=True)

В определенных обстоятельствах я хочу назначить родительский идентификатор события (event_pid) для события, но это должно быть целочисленное значение, а не ссылка на объект.

Когда я делаю следующее:

e.event_pid = event_pid

Я получаю следующее сообщение:

Cannot assign "u'1359741862566'": "Event.event_pid" must be a "ReccurenceEvent" instance.

Хорошо, но если предоставить экземпляр повторения с:

e.event_pid = ReccurenceEvent.objects.get(event_id = event_pid)

Я не храню целочисленное значение, которое мне нужно в ответе.

Может ли кто-то указать, где я иду не так?

4
james_dean 1 Фев 2013 в 22:17

2 ответа

Лучший ответ

Если вы посмотрите в своей базе данных, внешний ключ является целочисленным значением! но из-за формы Джанго вы можете взаимодействовать с точки зрения объектов, а не чисел

Чтобы получить целое число ForeignKey, вы должны иметь возможность получить к нему доступ через event_id

e.event_pid.event_id

3
dm03514 1 Фев 2013 в 18:23

Вы можете получить доступ к идентификатору RecurrenceEvent в своем представлении, посмотрев на e.event_pid.event_id.

Но я думаю, что вы неправильно называете поля своей модели.

class ReccurenceEvent(models.Model):

    event_id = models.IntegerField(primary_key=True)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    text = models.CharField(max_length=30)
    rec_type = models.CharField(max_length=32)
    event_length = models.BigIntegerField(null=True)

class Event(models.Model):

    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    text = models.CharField(max_length=30)
    rec_type = models.CharField(max_length=32)
    event_length = models.BigIntegerField(null=True)

    reccurance = models.ForeignKey(ReccurenceEvent, null=True)

Затем вы просто получаете доступ к атрибутам RecurranceEvent через событие. Кроме того, вам не нужно явно добавлять первичный ключ. Джанго делает это для тебя. Он доступен в .id и .pk.

Поэтому e.reccurance.id будет целым числом, которое вам нужно в вашем представлении / шаблоне.

2
aychedee 1 Фев 2013 в 18:24