2016-07-24 9 views
1

Ich habe versucht, eine Rest-API mit Django Rest Framework zum Erstellen von mobilen Anwendungen zu entwerfen. Ich könnte eine API für die Store-Liste entwerfen, die Informationen zum Händler (Händler), Geschäftsinformationen, Shopkategorie und Produkt anzeigt, aber das Produktbild wird nicht angezeigt. Warum zeigt mein Code kein Produktbild an? Könnte mir bitte jemand eine Idee oder einen Rat geben, warum es nicht funktioniert?Produktbild in einer API konnte nicht angezeigt werden

Mein Code

mein models.py

class Store(models.Model): 
    merchant = models.ForeignKey(Merchant) 
    name_of_store = models.CharField(max_length=100) 
    store_off_day = MultiSelectField(choices=DAY, max_length=7, default='Sat') 
    store_categories = models.ManyToManyField('StoreCategory',blank=True) 

    class Meta: 
     verbose_name = 'Store' 


class Product(models.Model): 
    store = models.ForeignKey(Store) 
    name_of_product = models.CharField(max_length=120) 
    description = models.TextField(blank=True, null=True) 
    price = models.DecimalField(decimal_places=2, max_digits=20) 
    # categories = models.ManyToManyField('Category',blank=True) 


class ProductImage(models.Model): 
    product = models.ForeignKey(Product) 
    image = models.ImageField(upload_to='products/images/') 
    updated = models.DateTimeField(auto_now_add=False, auto_now=True) 

class StoreCategory(models.Model): 
    product = models.ForeignKey(Product,null=True, on_delete=models.CASCADE,related_name="store_category") 
    store_category = models.CharField(choices=STORE_CATEGORIES, default='GROCERY', max_length=10) 

Serializers.py

class ProductImageSerializer(ModelSerializer): 
    class Meta: 
     model = ProductImage 
     fields = ('id','image',) 

class ProductSerializers(ModelSerializer): 
    image = ProductImageSerializer(many=True,read_only=True) 
    class Meta: 
     model = Product 
     fields=('id','image','name_of_product','description','price','active',) 

class StoreCategorySerializer(ModelSerializer): 
    product = ProductSerializers(read_only=True) 
    class Meta: 
     model = StoreCategory 

class StoreSerializer(ModelSerializer): 
    # url = HyperlinkedIdentityField(view_name='stores_detail_api') 
    store_categories = StoreCategorySerializer(many=True) 
    merchant = MerchantSerializer(read_only=True) 
    class Meta: 
     model = Store 
     fields=("id", 
       # "url", 
       "merchant", 
       "store_categories", 
       "name_of_store", 
       "store_contact_number", 
       "store_off_day", 
       ) 

Meine API

enter image description here

Antwort

1

In Ihrem models.py erstellen:

import os 

Produkte entfernen Fremdschlüssel aus dem Produktbild Modell:

class ProductImage(models.Model): 
    image = models.ImageField(upload_to='products/images/') 
    updated = models.DateTimeField(auto_now_add=False, auto_now=True) 

    @property 
    def imagename(self): 
     return str(os.path.basename(self.image.name)) 

Bild Fremdschlüssel zu Ihrem Produkt hinzufügen statt

class Product(models.Model): 
    image = models.ForeignKey(ProductImage,blank=True,null=True) 
    store = models.ForeignKey(Store) 
    name_of_product = models.CharField(max_length=120) 
    description = models.TextField(blank=True, null=True) 
    price = models.DecimalField(decimal_places=2, max_digits=20) 
    # categories = models.ManyToManyField('Category',blank=True) 

und dann in Ihrem serializers.py

So erhalten Sie den tatsächlichen Bildnamen und Speicherort.

+0

Hat genau wie Sie gesagt, aber immer noch Bildfeld wird nicht in einer API angezeigt. – pri

+0

Sie haben einen Fehler in Ihrem Fremdschlüsselverweis, anstatt ihn vom Produkt zu referenzieren, auf das Sie ihn von ProductImage verweisen. Siehe den aktualisierten Code. – dmitryro

+0

Ja, es funktioniert jetzt. Danke für Ihre Hilfe. Eine letzte Frage, mein Datenbankmodell betrachtend oder enitites sagend, Was denkst du über mein Modell und API-Design? Mache ich den richtigen Weg? Ich brauche nur Ihr Feedback (ich bin ein Anfänger), wenn Sie Ihre Zeit nicht den Code haben. – pri

Verwandte Themen