Octavian Niculescu
Octavian Niculescu

Reputation: 445

Exporting a field from another model, using foreign key

I've just set up the whole import-export thing and I just can't make it export a field from another model, using the foreign key.

models.py

from django.db import models
from django.contrib.auth.models import User
from datetime import date
from .validators import validate_file_size

# Create your models here.
class CORMeserii(models.Model):
    CodCOR = models.CharField(max_length=25, primary_key=True, unique=True)
    MeserieCor = models.CharField(max_length=50, unique=True)
    def __str__(self):
        return str(self.CodCOR + " - " + self.MeserieCor)
    class Meta:
       verbose_name_plural = "CORuri"

class Oferta(models.Model):
    solicitant = models.ForeignKey(User, on_delete=models.CASCADE)
    cor = models.ForeignKey(CORMeserii, on_delete=models.CASCADE)
    dataSolicitare = models.DateField(default=date.today)
    locuri = models.IntegerField()
    agentEconomic = models.CharField(max_length=50)
    adresa = models.CharField(max_length=150)
    dataExpirare = models.DateField()
    experientaSolicitata = models.CharField(max_length=200)
    studiiSolicitate = models.CharField(max_length=200)
    judet = models.CharField(max_length=20)
    localitate = models.CharField(max_length=25)
    telefon = models.CharField(max_length=12)
    emailContact = models.EmailField(max_length=40)
    rezolvata = models.BooleanField(default=False)
    def __str__(self):
        return str(self.cor)

admin.py

from django.contrib import admin
from .models import Oferta, CORMeserii
from import_export import resources
from import_export.admin import ImportExportMixin, ImportExportModelAdmin
import tablib

# Register your models here.
class CorImEx(resources.ModelResource):
    class Meta:
        model = CORMeserii

class CorAdmin(ImportExportMixin, admin.ModelAdmin):
    list_display = ('CodCOR', 'MeserieCor')
    resource_class = CorImEx

class CorImExAdmin(ImportExportModelAdmin):
    resource_class = CorImEx

class OferteImEx(resources.ModelResource):
    class Meta:
        model = Oferta
        fields = ('id', 'solicitant', 'cor', 'oferta.cor.MeserieCor')

class OfertaAdmin(ImportExportMixin, admin.ModelAdmin):
    list_display = ('id', 'solicitant', 'dataExpirare', 'dataSolicitare')
    resource_class = OferteImEx

class OferteImExAdmin(ImportExportModelAdmin):
    resource_class = OferteImEx

admin.site.register(Oferta, OfertaAdmin)
admin.site.register(CORMeserii, CorAdmin)

You can see it in the OferteImEx class - the field 'oferta.cor.MeserieCor'.

I want to export the MeserieCor field from the model CORMeserii - but I can't figure it out.

I tried with: 'oferta.cor.MeserieCor', cor.MeserieCor', 'MeserieCor' (even though the last 2 ones don't make sense to me at all).

Is there any way to export that field somehow, even though it is from another model? (I'm pretty sure there is but I can't figure it out)

Thanks.

Upvotes: 1

Views: 1368

Answers (1)

Borut
Borut

Reputation: 3364

In Django you use double underscore (__) to follow relationship in lookups. It's in the documentation:

Django offers a powerful and intuitive way to “follow” relationships in lookups, taking care of the SQL JOINs for you automatically, behind the scenes. To span a relationship, just use the field name of related fields across models, separated by double underscores, until you get to the field you want.

Link: Lookups that span relationship

There is even an example in the django import export documentation how to follow relationship:

When defining ModelResource fields it is possible to follow model relationships:

class BookResource(resources.ModelResource):

    class Meta:
        model = Book
        fields = ('author__name',)

Source: https://django-import-export.readthedocs.io/en/latest/getting_started.html#customize-resource-options

Upvotes: 2

Related Questions