【问题标题】:Django foreign key in model模型中的Django外键
【发布时间】:2015-03-07 10:34:24
【问题描述】:

我正在做一个项目,所以创建了一个模型并将所有数据导入 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)

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

【问题讨论】:

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


    【解决方案1】:

    最好的方法是将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'
    

    这会起作用,但在 admin 中为每一行过滤 Sttlmnt_typ_Master 效率非常低。您应该考虑切换到“外键”选项。

    EDIT:外键选项。

    __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_name 属性的symbol 字段。 Django 管理员足够聪明,可以将select_related('symbol') 添加到查询集,因此不会对数据库进行额外的查询。

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

    EDIT2:填充Auction.symbol 字段。

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

    See the documentation.

    【讨论】:

    • 我如何使用外键实现它,请给我一个例子
    • 第一个代码运行良好,感谢您提供宝贵的信息
    • 我不明白外键的实现,你能帮帮我。应用上述代码后,在 admin.py @catavaran 中应该做的所有事情
    • 您不需要更改管理员。然后管理员显示外键symbol字段它会自动调用该字段的__unicode__方法。
    • @sudeepkrishnan 要更改的是您的导入代码。它应该get_or_create 有效的Sttlmnt_typ_Master 实例并将其分配给symbol 字段。
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2019-07-19
    • 2015-01-29
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多