Django 外键赋值

4 投票
2 回答
5875 浏览
提问于 2025-04-17 14:28

我刚接触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)

在某些情况下,我想给一个事件分配一个父事件的ID(event_pid),但这个ID应该是一个整数,而不是指向对象的引用。

当我这样做的时候:

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)

我在响应中没有存储我需要的整数值。

有人能告诉我我哪里出错了吗?

2 个回答

2

你可以通过查看 e.event_pid.event_id 来获取 RecurrenceEvent 的 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)

然后你只需要通过事件来访问 RecurrenceEvent 的属性。而且,你不需要特别添加主键,Django 会自动帮你处理。主键可以通过 .id.pk 来访问。

所以 e.reccurance.id 就是你在视图或模板中需要的那个整数。

3

如果你查看你的数据库,会发现外键其实是一个整数值!但是因为使用了Django的ORM(对象关系映射),你可以通过对象来进行操作,而不是直接用数字。

要获取外键的整数值,你可以通过 event_id 来访问它。

比如,你可以这样写:e.event_pid.event_id

撰写回答