【问题标题】:Access values from joined table in django从 django 中的连接表访问值
【发布时间】:2020-10-01 13:54:09
【问题描述】:

我有 2 个表通过外键(类别、活动)链接在一起。我正在尝试使用活动对象从我的查询中访问类别表中的值。

模型类:

class Category(models.Model):
name = models.CharField(max_length=100)
weekly_goal = models.IntegerField(blank=True, null=True)
metacat_fk = models.ForeignKey(MetaCategory, models.DO_NOTHING, db_column='metacat_fk')

class Meta:
    managed = False
    db_table = 'category'


class Activity(models.Model):
name = models.CharField(unique=True, max_length=100)
distance = models.FloatField(blank=True, null=True)
duration = models.TimeField(blank=True, null=True)
date = models.DateField(blank=True, null=True)
note = models.CharField(max_length=100, blank=True, null=True)
category = models.ForeignKey(Category, models.DO_NOTHING, db_column='category_fk')

class Meta:
    managed = False
    db_table = 'activity'

尝试访问类别中的值:

activity = Activity.objects.select_related('category')
frequency_df = pd.DataFrame(list(activity.values()))

logging.warning(activity.query)
logging.warning(frequency_df.head())

输出:

SELECT "activity"."id", "activity"."name", "activity"."distance", "activity"."duration", "activity"."date", "activity"."note", "activity"."category_fk", "category"."id", "category"."name", "category"."weekly_goal", "category"."metacat_fk" FROM "activity" INNER JOIN "category" ON ("activity"."category_fk" = "category"."id")

     id                                name distance duration        date  note  category_id
     0  1382       Yoga - Wednesday June 19 2019     None     None  2019-06-19  Yoga            3
     1  1385  Yoga - Wednesday September 18 2019     None     None  2019-09-18  Yoga            3
     2  1388      Yoga - Tuesday October 08 2019     None     None  2019-10-08  Yoga            3
     3  1391      Yoga - Tuesday October 15 2019     None     None  2019-10-15  Yoga            3
     4  1394     Yoga - Saturday October 26 2019     None     None  2019-10-26  Yoga            3

根据我的查询,它正在从我的类别表中选择值,但我的 Activity 对象只包含我的 FK。我希望输出包含 category.name category.weekly 目标等列...

【问题讨论】:

  • .values() 只添加“根模型”的值。所以它“丢弃”了select_related

标签: django join django-models inner-join


【解决方案1】:

如果你想要相关的值,你需要明确地定义它们。

activity = Activity.objects.select_related('category')
activity_values = activity.values(
    "id", "name", "distance", [...], 
    "category__name", "category__weekly_goal", "category__metacat_fk__name"
)
frequency_df = pd.DataFrame(list(activity_values))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多