2016-05-22 8 views
0

Ich suche Design eine einfache App, die Anzahl der Fahrzeuge protokolliert, die durch einen Punkt mit ihren Details eingeben.Erzeugen Sie dann einen Bericht über verschiedene Dienstleistungen/Fahrzeuge/etc. Ich habe mir ein Mustermodell ausgedacht.Entwerfen eines Modells für den Fahrzeugeinstieg in Django

from django.db import models 

# Create your models here. 

class Service(models.Model): 
    service_name = models.CharField(max_length = 60) 
    timestamp = models.DateTimeField(auto_now_add = True,auto_now = False) 

    def __unicode__(self): 
     return self.service_name 

class Place(models.Model): 
    place_name = models.CharField(max_length = 120) 
    state = models.CharField(max_length=60) 
    timestamp = models.DateTimeField(auto_now_add = True,auto_now = False) 

    def __unicode__(self): 
     return self.place_name 

class Connection(models.Model): 
    vehicle_no = models.CharField(max_length = 15) 
    service= models.ForeignKey(Service) 
    source = models.ForeignKey(Place,related_name = 'source') 
    destination = models.ForeignKey(Place,related_name = 'destination') 
    trip_distance = models.PositiveIntegerField() 
    entry_timestamp = models.DateTimeField(auto_now_add = True,auto_now = False) 

    def __unicode__(self): 
     return self.vehicle_no 

class GlobalOption(models.Model): 
    config_option = models.CharField(max_length=120) 
    value = models.CharField(max_length = 60) 

Admin.py

from django.contrib import admin 
from .models import Connection,Service,Place,GlobalOption 
from .forms import ConnectionForm 
# Register your models here. 


class ConnectionAdmin(admin.ModelAdmin): 
    form = ConnectionForm 
    list_display = ('vehicle_no','service','source','destination','trip_distance','Connection_timestamp') 
    list_filter = ['Connection_timestamp'] 
    search_fields = ['service__service_name','vehicle_no'] 

class OptionAdmin(admin.ModelAdmin): 
    fields = ['config_option','value'] 
    list_display = ('config_option','value') 

class ConnectionInline(admin.TabularInline): 
    model = Connection 
    extra = 1 

class PlaceAdmin(admin.ModelAdmin): 
    list_display = ['place_name','timestamp'] 
    class Meta: 
     Model = Place 

class ConnectionInline(admin.TabularInline): 
    model = Connection 
    extra = 1 

class ServiceAdmin(admin.ModelAdmin): 
    list_display = ['service_name','timestamp'] 
    class Meta: 
     Model = Service 
    inlines = [ConnectionInline] 


admin.site.register(Connection,ConnectionAdmin) 
admin.site.register(Service,ServiceAdmin) 
admin.site.register(Place,PlaceAdmin) 
admin.site.register(GlobalOption,OptionAdmin) 

jedoch in der Admin, wenn ich eine Verbindung hinzufügen, ist es möglich, gleiche Ursprungs- und Zielposition zu haben. Ich möchte das nicht. Wie wäre es auch möglich, die Auswahlliste für Ziele nach Auswahl einer Quelle dynamisch zu generieren?

Da gibt es nur eingehende Verbindungen auf dieser App, wäre eine bessere Design-Entscheidung, getrennte Modelle für Sources und Destinationen zu haben?

Antwort

0

Wenn Sie nicht möchten, dass die gleiche Quelle/das gleiche Ziel ausgewählt wird, können Sie das in der clean() Methode für Ihr Formular behandeln.

Sie könnten Entscheidungen & generieren sie auf der Grundlage Ihrer Quelle/Ziel-Modelle, Ihr Design sieht in Ordnung, aber beachten Sie die Option, die separaten Modelle zu erstellen. Ich mache ähnliche Entscheidungen, die auf den Werten in verschiedenen Spalten einer Tabelle basieren.

class GetResults(forms.ModelForm): 

    @staticmethod 
    def get_choices(event_year): 

     key = FORM_CHOICES_CACHE_KEY.format(
      year=event_year 
     ) 
     choices = cache.get(key) 

     if choices: 
      return choices 

     age_categories = set() 
     events = set() 

     for age_category, event in Result.objects.values_list('age_group', 'event').distinct(): 
      if age_category: 
       age_categories.add(age_category) 
      if event: 
       events.add(event) 

     age_categories = [ 
      (ac, ac) for ac in sorted(age_categories, key=lambda a: a.lower()) 
     ] 
     events = [ 
      (e, e) for e in sorted(events, key=lambda a: a.lower()) 
     ] 

     choices = (
      age_categories, 
      events 
     ) 

     cache.set(key, choices, FORM_CHOICES_CACHE_LENGTH) 

     return choices 

    def __init__(self, event_year, *args, **kwargs): 

     self.event_year = event_year 
     if not self.event_year: 
      self.event_year = datetime.datetime.utcnow().year 

     age_categories, events = self.get_choices(event_year) 

     super(GetResults, self).__init__(*args, **kwargs) 

     self.fields['age_group'] = forms.ChoiceField(choices=age_categories) 
     self.fields['age_group'].label = _("Age category") 

     self.fields['event'] = forms.ChoiceField(choices=events) 
     self.fields['event'].label = _("Event") 

    class Meta: 
     model = Result