哪个是最好的ForeignKey还是选择?有什么不同?

时间:2012-01-12 09:39:07

标签: django django-models

我想要创建汽车广告网站 我有许多名单,如年份,品牌和状态

这是最好用的类别或选择列表 并考虑到我想制作扩展搜索引擎

查看牵引方法的代码

YEARS = (
    ("1990", "1990"),
    ("1991", "1991"),
    ("1992", "1992"),
.
.
.
.
    ("2013", "2013"),
 )

class Whatever(models.Model):
    # Show a list with years
    birthdate = models.IntegerField(max_length=2, choices=YEARS)

  #OR this method

class ChoiceYears(models.Model):
    type = models.CharField(max_length=60)
    def __unicode__(self):
         return '%s' % self.typeclass Adv(models.Model):
 class Adv(models.Model):
    years = models.ForeignKey(ChoiceYears)

和这个

class ChoiceStatus(models.Model):
    type = models.CharField(max_length=60)
    def __unicode__(self):
         return '%s' % self.type
class Adv(models.Model):
    status = models.ForeignKey(ChoiceStatus)

  #OR this method

STATUS = (
    (1, u'new'),
    (2, u'old'),
)

class Adv(models.Model):
   status = models.IntegerField(u'??????', choices=STATUS, default=1,)

2 个答案:

答案 0 :(得分:3)

当项目几乎是静态时,使用choices是合适的:它们不会改变或不经常更改,也不需要自己“做”任何事情。

当该字段的“选项”是动态的(可能随时或随心所欲地改变)或者您需要将其他数据与这些“选择”相关联时,请使用ForeignKey。

但是,出于您的目的,“年”和“状态”都是使用choices的合适人选。只有一定数量的汽车“状态”:新的,使用过的等等。年份不适合作为自己的模型,因此使用choices也是个好主意。但是,我会将其更改为:

YEAR_CHOICES = [(y, y) for y in range(1990, datetime.now().year+2)]

“1990”是您想要开始的年份。 datetime.now().year可以获得当前年份,因为range不是最终包含(它返回最多而不是最后一个数字)并且您似乎正在处理模型年在这里(比当前年份大1),你必须总计增加2。

答案 1 :(得分:0)

为什么在选择为您完成工作时,您想要定义外键关系?我会选择方式