Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 导出具有反向外键关系的模型的xlsx文件,并将该反向外键关系作为单独的列_Django_Django Models_Django Import Export - Fatal编程技术网

Django 导出具有反向外键关系的模型的xlsx文件,并将该反向外键关系作为单独的列

Django 导出具有反向外键关系的模型的xlsx文件,并将该反向外键关系作为单独的列,django,django-models,django-import-export,Django,Django Models,Django Import Export,我正在使用django导入导出包将数据导出到xlsx文件中 以所需格式将数据导出到excel时出现问题 models.py class Fans(models.Model): """ Model for survey answering people """ fan_id = models.AutoField(db_column='FAN_ID', primary_key=True) fi

我正在使用django导入导出包将数据导出到xlsx文件中

以所需格式将数据导出到excel时出现问题

models.py

class Fans(models.Model):
    """
        Model for survey answering people
    """
    fan_id = models.AutoField(db_column='FAN_ID', primary_key=True)
    first_name = models.CharField(
        db_column='FIRST_NAME', max_length=45, blank=True, null=True)
    last_name = models.CharField(
        db_column='LAST_NAME', max_length=45, blank=True, null=True)
    phone = models.CharField(
        db_column='PHONE', max_length=45, blank=True, null=True)
    email = models.CharField(
        db_column='EMAIL', max_length=45, blank=True, null=True)
    gender = models.CharField(
        db_column='GENDER', max_length=45, blank=True, null=True)

class Responses(models.Model):
    """
        Model for responses given by fans
    """
    survey = models.ForeignKey(
        Surveys, on_delete=models.CASCADE, db_column='SURVEY_ID', related_query_name="part")
    fan = models.ForeignKey(Fans, on_delete=models.CASCADE,
                            db_column='FAN_ID', related_query_name="given", related_name="given")
    survey_question = models.ForeignKey(
        SurveyQuestions, on_delete=models.DO_NOTHING, db_column='SURVEY_QUESTION_ID',
        related_query_name="response")
    response = models.CharField(
        db_column='RESPONSE', max_length=255, blank=True, null=True)
    correct_answer = models.IntegerField(
        db_column='CORRECT_ANSWER', blank=True, null=True)
    load_id = models.IntegerField(db_column='LOAD_ID', blank=True, null=True)

class SurveyQuestions(models.Model):
    """
        Model for surveys questions
    """
    survey = models.ForeignKey(Surveys, on_delete=models.CASCADE,
                               db_column='SURVEY_ID', related_query_name="question")
    survey_question_id = models.AutoField(
        db_column='SURVEY_QUESTION_ID', primary_key=True)
    survey_question_name = models.CharField(
        db_column='SURVEY_QUESTION_NAME', max_length=255)
    question = models.CharField(
        db_column='QUESTION', max_length=255, blank=True, null=True)
    response_type = models.CharField(
        db_column='RESPONSE_TYPE', max_length=255, blank=True, null=True)
    load_date = models.DateField(db_column='LOAD_DATE', auto_now_add=True)
我想以以下格式导出带有记录响应的风扇数据:

first_name, last_name, phone, email, question1, question2, question3
abc, xyz, 1234566780, abc@gmail.com, response1, response2, response3
first_name, last_name, phone, email, given
abc, xyz, 1234566780, abc@gmail.com, {question1: response1, question2: response2, question3: response3}
在这里,前四个字段直接来自Fans模型,但最后三列标题表示SurveyQuestions模型中的“问题”字段,值来自Responses模型的“响应”字段

到目前为止,我能够实现以下格式:

first_name, last_name, phone, email, question1, question2, question3
abc, xyz, 1234566780, abc@gmail.com, response1, response2, response3
first_name, last_name, phone, email, given
abc, xyz, 1234566780, abc@gmail.com, {question1: response1, question2: response2, question3: response3}
给定字段是作为键值对的问题响应的json

管理员

class FanResource(resources.ModelResource):

    """
        Resource for exporting to excel
    """

    given = fields.Field()

    class Meta:
        model = Fans
        fields = ("first_name", "last_name", "email",
                  "phone", "given")

    def dehydrate_given(self, instance):
        res = {}
        for x in instance.given.values('response', 'survey_question__question'):
            res[x['survey_question__question']] = x['response']
        return json.dumps(res)
任何帮助都将不胜感激。提前谢谢

14/10/20更新

使用下面的答案,我能够实现所需的格式。代码如下:

def after_export(self, queryset, data, *args, **kwargs):
        survey_questions = {x["survey_question_id"]: x["question"] for x in SurveyQuestions.objects.filter(
            survey=self.survey).values('survey_question_id', 'question')}
        for k, v in survey_questions.items():
            res = []
            for x in queryset:
                try:
                    res.append(x.given.get(survey_question=k).response)
                except ObjectDoesNotExist:
                    res.append(None)
            data.append_col(res, header=v)

现在的问题是,它花费的时间太长,因为它针对每个条目访问数据库。另一个问题是顺序不正确(即响应与相应的风扇不在同一行)。

我认为实现这一点的方法是覆盖并操作导出的数据集。例如:

导出后的定义(self、queryset、data、*args、**kwargs): 响应1=[i代表范围内的i(数据高度)] 数据。追加列(response1,header=“response1”) response2=[i代表范围内的i(数据高度)] data.append_col(response2,header=“response2”)
这将在导出的末尾追加新列。在
after_export()
中,您将可以访问数据集和查询集,因此希望您可以操作这些数据以正确填写“响应”列。

谢谢!这是向前迈出的一步。我能够覆盖并实现我想要的格式,但存在一些问题。我正在编辑我的问题,你能帮我吗?也许最好发布一个新的问题,但也记录你的数据库查询以找到瓶颈,也许会有帮助