【问题标题】:Django Model self referencing M2M fieldDjango 模型自引用 M2M 字段
【发布时间】:2017-07-06 23:26:38
【问题描述】:

我正在尝试让 Django 模型自动为自身构造一个典型的 __str__(self) 值(在模型定义中),但基于 3 个 ManyToMany 字段。与使用基本字段类型(如前两个模型)不同,这似乎不适用于 M2M 字段(参见第三个模型)。 该模型可以正常迁移,但在管理员中引用时会导致错误。

非常感谢任何帮助,谢谢!

class Party(models.Model):
    name=models.CharField("Party", max_length=150)  
    def __str__(self):              # __unicode__ on Python 2
        return self.name

    class Meta:
         ordering = ('name',)

class ValCharBehav(models.Model):
    name=models.CharField("Value / Character / Behaviour", max_length=150, unique=True)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class ValCharBehavWithPeople(models.Model):
    vcb=models.ManyToManyField(ValCharBehav, verbose_name="Value / Character / Behvaiour")
    bywhom=models.ManyToManyField(Party, verbose_name="By Whom", blank=True, related_name="valCharByWhomReverseAccessor")
    towhom=models.ManyToManyField(Party, verbose_name="To Whom", blank=True, related_name="valCharToWhomReverseAccessor")

    def __str__(self):              # __unicode__ on Python 2
         return self.vcb.name+": by: "+self.bywhom.name+", to: "+self.towhom.name

【问题讨论】:

    标签: django m2m


    【解决方案1】:
    def get_vcb_name(self):
        return ' | '.join(self.vcb.filter(
            name__isnull=False
        ).values_list('name', flat=True))
    
    def get_bywhom_name(self):
        return ' | '.join(self.bywhom.filter(
            name__isnull=False
        ).values_list('name', flat=True))
    
    def get_towhom_name(self):
        return ' | '.join(self.towhom.filter(
            name__isnull=False
        ).values_list('name', flat=True))
    
    def __str__(self):           
         return self.get_vcb_name()+": by: "+self.get_bywhom_name()+", to: "+self.get_towhom_name()
    

    【讨论】:

      【解决方案2】:

      或者,如果您更喜欢@ykh 回答的更简洁的版本:

      def __str__(self):
          return '%s, by %s, to %s' % [ 
              ' | '.join(x.values_list('name', flat=True))
              for x in (self.vcb, self.bywhom, self.towhom) ]
      

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-07
        • 2022-01-22
        • 1970-01-01
        • 2013-02-05
        • 2019-08-09
        相关资源
        最近更新 更多