Django外键模型

时间:2015-01-09 06:20:31

标签: django python-2.7 django-models foreign-keys

我正在做一个项目,所以创建了一个模型并将所有数据导入django admin,所以我的表看起来像这样

Dates          Sr no   Symbol      Series    Qty
Oct. 19, 2013   245    ZYDUSWELL    EQ      5
Oct. 19, 2013,  244    ZEEL         EQ      96
Oct. 19, 2013,  243    YESBANK      EQ      74
Oct. 19, 2013,  242    WIPRO        EQ      65

我创建了另一个描述列符号完整形式的表,但是客户端需要显示完整的表单而不是上表中显示的符号如何实现这个我的代码

给定表格的模型

class Auction(models.Model):
    dates = models.DateTimeField(editable=False,null=True)
    sr_no = models.IntegerField(editable=False,null=True)
    symbol = models.CharField(max_length=35, editable=False)
    series = models.CharField(max_length=35, editable=False,null=True)
    qty = models.IntegerField(editable=False,null=True)

模型包含完整形式的符号

class Sttlmnt_typ_Master(models.Model): 
    symbol = models.CharField(max_length=10, editable=False)
    symbol_name =  models.CharField(max_length=35, editable=False)

-----请帮助我....... !!!!

1 个答案:

答案 0 :(得分:2)

最好的方法是将symbol字段作为Sttlmnt_typ_Master的外键。

但如果您确定需要这样的模型,请将此方法添加到ModelAdmin

class AuctionAdmin(admin.ModelAdmin):
    list_display = ('dates', 'sr_no', 'symbol_display', 'series', 'qty')

    def symbol_display(self, obj):
        symbol = Sttlmnt_typ_Master.objects.filter(symbol=obj.symbol).first()
        return symbol.symbol_name if symbol else obj.symbol
    symbol_display.short_description = 'Symbol'

这样可行但是对管理中的每一行过滤Sttlmnt_typ_Master都是非常低效的。您应该考虑切换到“外键”选项。

编辑:外键选项。

__unicode__方法添加到Sttlmnt_typ_Master模型,并将Auction.symbol字段更改为ForeignKey

class Sttlmnt_typ_Master(models.Model): 
    symbol = models.CharField(max_length=10, editable=False)
    symbol_name =  models.CharField(max_length=35, editable=False)

    def __unicode__(self):
        return self.symbol_name

class Auction(models.Model):
    dates = models.DateTimeField(editable=False, null=True)
    sr_no = models.IntegerField(editable=False, null=True)
    symbol = models.ForeignKey(Sttlmnt_typ_Master, editable=False)
    series = models.CharField(max_length=35, editable=False, null=True)
    qty = models.IntegerField(editable=False, null=True)

现在,管理员中的更改列表将显示symbol属性symbol_name字段。 Django admin非常聪明,可以将select_related('symbol')添加到queryset中,因此不会对数据库进行额外的查询。

当然,您应该更改导入功能,以使用有效的Auction.symbol实例而不是纯文本填充Sttlmnt_typ_Master个字段。

EDIT2 :填充Auction.symbol字段。

symbol = 'ZYDUSWELL'
auction.symbol, created = Sttlmnt_typ_Master.objects.get_or_create(
                             symbol=symbol, defaults={'symbol_name': symbol})

See the documentation