Dateipfad anpassen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Freumel
User
Beiträge: 69
Registriert: Donnerstag 25. Januar 2018, 13:47

Hallo zusammen,
ich habe mein Model wie folgt erstellt:

Code: Alles auswählen

class Customer(models.Model):
	key = models.CharField(max_length=6)

class Order(models.Model):
	customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
	key = models.CharField(max_length=8)

class Img(models.Model):
	order = models.ForeignKey(Order, on_delete=models.CASCADE)
	img = models.ImageField(upload_to = 'files'.format())

nun soll das Bild aber in folgendem Pfad gespeichert werden:

Code: Alles auswählen

imgPath = os.path.join(settings.MEDIA_ROOT, 'Kunden', customer.key, order.key)
Nun die Frage: Wie mache ich das?
Am leichtesten wäre es, bereits in der Tabelle Img auf den Pfad zu referenzieren. Habe ich nicht hingekriegt.
Habe mir vorerst mit einem post_save Signal geholfen:

Code: Alles auswählen

def imagePath(sender, **kwargs):
	if kwargs['created']:
		data = kwargs['instance']
		file = data.img.path
		newPath =  os.path.join(
			settings.MEDIA_ROOT,
			'Kunden',
			data.order.customer.key,
			data.order.key, 
			'Bilder',
			data.img.url.split('/')[-1]
		)
		copyfile(file, newPath)

post_save.connect(imagePath, sender=Img)


def createCustomerFolder(sender, **kwargs):
	if kwargs['created']:
		os.mkdir(os.path.join(
				settings.MEDIA_ROOT,
				'Kunden',
				kwargs['instance'].key
			)
		)

post_save.connect(createCustomerFolder, sender=Customer)


def createOrderFolder(sender, **kwargs):
	if kwargs['created']:
		orderDir = os.path.join(
			settings.MEDIA_ROOT,
			'Kunden',
			kwargs['instance'].customer.key,
			kwargs['instance'].key
		)

		os.mkdir(orderDir)
		os.mkdir(os.path.join(orderDir, 'Bilder'))


post_save.connect(createOrderFolder, sender=Order)
Aber das kann es doch auch nicht sein, zumal ich es nicht hinkriege den Bildpfad nachträglich anzupassen :|
(Anbei: Order und Customer beeinhalten noch mehr Attribute, daher war es nötig diese aufzuteilen. Für den Dateipfad sind diese aber irrelevant)
Eventuell hat ja jemand einen Vorschlag für mich :-)
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe keine Ahnung von DJANGO-orm, aber kannst du das nicht einfach als Python property machen, in dem du bei Zugriff auf zB image_path den dann zusammensetzt aus dem settings-Pfad und dem Segment "img" das in der DB gespeichert ist? Oder gleich den ganzen Image-Blob in der DB speichern, statt da mit lokalen Pfaden rumzuroedeln, die dann auch nochmal extra Zugriffsrechte brauchen etc.
sagrotan
User
Beiträge: 4
Registriert: Sonntag 2. November 2014, 20:47

Hallo,

ich bin mir nicht sicher, ob ich dein Problem korrekt interpretiere - aber geht es darum, Fotodateien in einem spezifischen "Unterordner" unter "/media/" korrekt abzuspeichern? (bin gerade zu müde, mich durch deinen Code zu lesen -sorry).

Ich mache das bei mir wie folgt - Hintergrund: Ich speichere Fotos ab, die verschiedenen Gallerien zugeordnet werden (models.py). Also Bild 1, 7, 15 zu gallery-urlaub-2017 und Bilder 2, 5, 19 zu gallery-arbeit-0815

Zunächst habe ich folgenden Code in der models.py, um den Pfad zu definieren (Bilder sollen unter dem Gallery-Namen abgespeichert werden):

def gal_dir_path(instance1, filename):
return 'gallery_{0}/{1}'.format(instance1.gallery_id, filename)

# models. py
class Gallery(models.Model):
...
# in der Gallery wird immer ein Startbild erfasst - im folgenden Code wird das Startbild der Gallery unter /media/starerImages/... abgespeichert - was für dich aber wohl weniger relevant ist:
starter_image = models.ImageField(upload_to='starterImages', null=False, blank=False, width_field="width",
height_field="height", default="starterImages/22.jpg")

# Hier werden die eigentlichen Fotos erfasst. Jedes Foto wird dann gleich einer Gallery zugeordnet - und davon gibt es einige:
class Photo(models.Model):
...
# Jedes "Photo" wird dann unter der zugeordneten Gallery (FK) als Namen abgespeichert - und landet im Unterordner, also z.B. /media/gallery-urlaub-2017/foto-1.jpg, ...
image = models.ImageField(upload_to=gal_dir_path, null=False, blank=False, width_field="width", height_field="height")
gallery = models.ForeignKey(Gallery, on_delete=models.CASCADE)


... ich hoffe, das hilft gegebenenfalls - ansonsten ein paar Erläuterungen in Worten was du möchtest und worin das Problem liegt?!
Grüße
sagro
Antworten