1

I am trying to map a relationship between a gym model and its offer and events model. The idea is 1 gym can have many offers and many events. But 1 offer cannot belong to many gyms and 1 event cannot belong to many gyms. So, with the look of things, it is a one to Many relation. So far so good. This is my first time working with the Django ORM, so my approach might be a bit naive. I would like to essentially have tables in my db such as a table for gym, table for events and a table for offers. The offer and event table is connected to the gym through the gym id.How can i achieve that ? Because so far i see some pretty strange things in my Django admin page.This is what i tried so far

class Program(models.Model):
    id = models.AutoField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    last_updated = models.DateTimeField(auto_now=True, editable=False)
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    class Meta:
        ordering = ('last_updated',)


    def __str__(self):
        return "%s %s" % (self.id, self.price)


class Offer(models.Model):
    id = models.AutoField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    last_updated = models.DateTimeField(auto_now=True, editable=False)
    name = models.CharField(max_length=100)
    numberofsessions = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    expireddate = models.DateTimeField(auto_now_add=True, editable=False)

    class Meta:
        ordering = ('last_updated',)


    def __str__(self):
        return "%s %s" % (self.id, self.expireddate)


class Event(models.Model):
    id = models.AutoField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    last_updated = models.DateTimeField(auto_now=True, editable=False)
    name = models.CharField(max_length=100)
    location = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    eventdate = models.DateTimeField(auto_now_add=True, editable=False)

    class Meta:
        ordering = ('last_updated',)


    def __str__(self):
        return "%s %s" % (self.id, self.eventdate)


class User(models.Model):
    id = models.AutoField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    last_updated = models.DateTimeField(auto_now=True, editable=False)
    name = models.CharField(max_length=100)
    phonenumber = models.CharField(max_length=100)
    amount = models.DecimalField(max_digits=6, decimal_places=2)
    contact = models.CharField(max_length=100)
    email = models.EmailField(max_length=70)
    monthpaid = models.CharField(max_length=100)

    class Meta:
        ordering = ('last_updated',)


    def __str__(self):
        return "%s %s %s" % (self.id, self.phonenumber,self.monthpaid)


class Gym(models.Model):
    # Fields
    program = models.ForeignKey(Program)
    event = models.ForeignKey(Event)
    offer = models.ForeignKey(Offer)
    event = models.ForeignKey(Event)
    user = models.ForeignKey(User)
    id = models.AutoField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    last_updated = models.DateTimeField(auto_now=True, editable=False)
    name = models.CharField(max_length=100)
    email = models.CharField(max_length=100, null=True, blank=True)
    phonenumber = models.CharField(max_length=100)
    website = models.CharField(max_length=100, null=True, blank=True)
    location = models.CharField(max_length=500)
    zipcode = models.CharField(max_length=100, null=True, blank=True)
    contactperson = models.CharField(max_length=100)

    class Meta:
        ordering = ('last_updated',)

    def __str__(self):
        return "%s %s" % (self.id, self.name)

admin.py
from django.contrib import admin
from .models import Gym, Event, Offer, Program, User


class Gyminline(admin.TabularInline):
    model = Gym


class EventAdmin(admin.ModelAdmin):
    inlines = (Gyminline,)

admin.site.register(Event, EventAdmin)


class OfferAdmin(admin.ModelAdmin):
    inlines = (Gyminline,)



admin.site.register(Offer, OfferAdmin)


class ProgramAdmin(admin.ModelAdmin):
    inlines = (Gyminline,)



admin.site.register(Program, ProgramAdmin)


class UserAdmin(admin.ModelAdmin):
    inlines = (Gyminline,)


admin.site.register(User, UserAdmin)
  • OneToMany *is* a ForeignKey (or rather, it's the automatically generated inverse relation). You've put the foreign key on the wrong model, simply. Instead of `offer = models.ForeignKey(Offer)` on `Gym`, you should put `gym = models.ForeignKey(Gym)` on `Offer` model. Then `gym` instances will have an inverse relation `offer_set`. – wim Aug 27 '18 at 23:05

0 Answers0