Saturday, July 1, 2017

Creating list of sub-objects where...

Hi!

Maybe I did something wrong when trying to program with Django in my first thread here. Maybe I did the relationship the wrong way, maybe the docs are containing the wrong words because of my poor database knowledge. But now I came quite far (and hopefully someone can use that code below as example for better understanding of Django) :-)
models.py (don't wonder why multiple colors are allowed):

from django.db import models

# Create your models here.

# class NameManager(models.Manager):
   
# def get_by_natural_key(self, name):
       
# return self.get(name=name)

class FactoryName(models.Model):
    name
= models.CharField(max_length=100, unique=True)

   
def __str__(self):
       
return self.name

class Option(models.Model):
    name
= models.CharField(max_length=100, unique=True)
    factory
= models.ForeignKey(FactoryName, on_delete=models.CASCADE)

   
def __str__(self):
       
return self.name

class AbstractOptionPackage(models.Model):
    name
= models.CharField(max_length=100, unique=True)
    description
= models.TextField()
    options
= models.ManyToManyField(Option)
   
class Meta:
       
abstract = True
   
   
def __str__(self):
       
return self.name
   
class InteriorPackage(AbstractOptionPackage):
   
def __str__(self):
       
return self.name

class ExteriorColor(models.Model):
    name
= models.CharField(max_length=100, unique=True)

   
def __str__(self):
       
return self.name

class Export(models.Model):
    name
= models.CharField(max_length=100, unique=True)
    exterior_colors
= models.ManyToManyField(ExteriorColor)
    interior_package
= models.ForeignKey(InteriorPackage, on_delete=models.CASCADE)

   
def __str__(self):
       
return self.name

Now I would like to create a YAML file which looks roughly like this (it will be processed in other software, "# ..." are just comments here in this posting):
Filename: {{Export.name}}.yaml # I think I already found "open(...)" example code also for serialization.


{{Factory[0].name}}: # Name of first factory
   
- {{ options[0] from any class derived from AbstractOptionPackage where Option.factory = Factory[0].name }}
    - {{ options[1] from any class derived from AbstractOptionPackage where Option.factory = Factory[0].name }}
    - [...]

{{Factory[1].name}}: # Name of second factory
   
- {{ options[0] from any class derived from AbstractOptionPackage where Option.factory = Factory[1].name }}
    - {{ options[1] from any class derived from AbstractOptionPackage where Option.factory = Factory[1].name }}
    - [...]
Colors:
   
{{ Export.exterior_colors }}:
        - selected_
exterior_colors[0]
   
    - selected_exterior_colors[1]
   
    - [...]
    # to be extended with interior_colors.

or as example (should be quite valid YAML):
Filename: vehicle_model_A.yaml


Factory_A:
   
- basic_air_conditioning
    - more_chrome

Factory_B:
   
- leather_seats
    - best_radio
Colors:
    exterior_colors :
 
       - green
        - yellow

I can already create some sort of YAML file for download via browser (PyYAML installed :-)):
admin.py

from django.contrib import admin
from django.http import HttpResponse
from django.core import serializers

# Register your models here.

from .models import Export, FactoryName, Option, InteriorPackage, ExteriorColor

# admin.site.register(Export)
admin.site.register(FactoryName)
admin.site.register(Option)
admin.site.register(InteriorPackage)
admin.site.register(ExteriorColor)


def export_all_as_yaml(modeladmin, request, queryset):
    response = HttpResponse(content_type="application/yaml")
    for object in Export.objects.all():
        autobuild_binaries = object.filter(AdditionalBinariesGroup)
    serializers.serialize("yaml", to_export, stream=response)
    return response

class ExportFunction(admin.ModelAdmin):
    def exterior_colors_list(self, obj):
        return "\n".join([o.name for o in obj.exterior_colors.all()])

    list_display = [
        'name',
        'exterior_colors_list',
        'interior_package',
        ]
    ordering = ['name']
    actions = [export_all_as_yaml]

admin.site.register(Export, ExportFunction)

But now there're problems. I searched much on the internet but somehow it didn't work.
1. Couldn't manage to create the queryset/filter. Always error messages that this and that doesn't exist.
2. When there's a database relationship, only the id of the entry/entries is shown but not the actual name. I tryed that models.Manager class thing but it didn't work somehow (still ids). Of course there were more code lines concerning this than shown here.
3. "Wrong" YAML format ([0, 1, 2, [...] ...]. That block style would be better for usage with diff etc. There seems to be a PyYAML option but I can't use that in Django without more complicated changes?! Maybe a specially created export function is necesseray? (no re-import into the Django app necessary)
4. I always want to export all Export entries. But Django avoids calling the function if not at least one entry is selected. To add something like the "add ..." button seems to be more complicated with a custom HTML file? Currently it works for me as it is. So it's not that important.

Thanks!

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/193c7ea3-1d5c-4cf9-8120-683e1efc7d30%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment