【问题标题】:Django Model ForeignKey ReciprocationDjango 模型外键交互
【发布时间】:2021-11-08 17:53:04
【问题描述】:

我想知道对于模型来说,回报 ForeignKey 存在的最佳方式是什么。 IE。我希望能够在管理页面的模型中看到关联的 ForeignKey,而不仅仅是模型的初始实例。

电子邮件 Models.py

class ScheduledEmail(models.Model):
    primary_key = models.AutoField(primary_key=True)
    recipient_name = models.TextField()
    subject = models.TextField()
    message = models.TextField()
    datetime_sent = models.TextField(max_length=20, default='Not Yet Sent')
    datetime_created = models.TextField(max_length=20)
    recipient_email = models.EmailField(max_length=50, default='Email Not Found')
    sent = models.BooleanField(default=False)
    recipient = models.ForeignKey(Client,
                                  on_delete=models.CASCADE,
                                  related_name='scheduled_emails_sent')

    def __str__(self):
        return f'{self.primary_key},{self.recipient_name}, {self.message}, {self.datetime_sent},' \
               f'{self.datetime_created}, {self.recipient_email}, {self.sent}, {self.recipient}'

客户端模型.py


class Client(models.Model):
    primary_key = models.AutoField(primary_key=True)
    unique_num = models.TextField(max_length=30)
    name = models.TextField(max_length=30, default='Name Not Found')
    number = models.TextField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return f'{self.name}, {self.number}, {self.email}, {self.unique_num}, {self.primary_key}'

【问题讨论】:

    标签: python django model


    【解决方案1】:

    这会导致 list_display 部分和收件人列(在您的管理面板内)同时显示您想要在 ScheduledEmail 类中的内容和您的收件人值。由于我们无法显示多对多和外键值,我们必须将它们转换为 str。顺便说一句,我在我的项目中使用了这个功能;让我显示输出:

    在此,我在'title'列中展示了我的游戏,在'platform'列中展示了它的平台(即ManytoMany字段)(外键和ManytoMany在这方面是相同的)。

    这是我的管理面板,我说显示每个游戏及其平台

    class GameAdmin(admin.ModelAdmin):
        list_display = ('title', 'slug', 'image_tag', 'platform_to_str')
        search_fields = ('title', 'slug')
        prepopulated_fields = {"slug":("title",)}
    
        def platform_to_str(self, obj):
            return ", ".join([platform.title for platform in 
        obj.platform.all()])
        platform_to_str.short_description = "platform"
    
    admin.site.register(Game, GameAdmin)
    

    这是我的模型:

    class Game(models.Model):
        title = models.CharField(max_length=50)
        description = models.TextField()
        slug = models.SlugField(max_length=100, unique=True)
        image = models.ImageField(upload_to="images")
        platform = models.ManyToManyField(Platform)
    

    例如,在您的 admin.py 中,我们应该说:

    class ScheduledEmailAdmin(admin.ModelAdmin):
        list_display = ('all thing that you want to show in admin panel', 'recipient_to_str')
        search_fields = ('title', 'description')
    
        def recipient_to_str(self, obj):
            return ", ".join([client.recipient for recipient in obj.recipient.all()])
        recipient_to_str.short_description = "recipient"
    

    因为我不知道你在Client类中的receiver等于什么,所以我说'client.recipient'。

    如果不再问,我希望它很清楚

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • 我为这两个应用添加了 model.py 作为参考。之前没有添加它们,因为我认为这只会使一个简单的问题复杂化。
    • 你能更新答案吗?我不知道如何为我的模型做这件事啊哈哈。
    • @BakedPotato 我已经编辑了,你看一下
    • 我很感激。
    猜你喜欢
    • 2021-11-19
    • 2013-01-17
    • 2019-07-19
    • 2015-01-29
    • 2020-11-13
    • 2011-11-29
    • 2013-09-28
    • 2016-05-25
    • 2015-03-07
    相关资源
    最近更新 更多