Thank you so much for the reply and help. I am not stuck with this database
format and can change it as necessary. I will modify it as you suggested
(let Django create the primary key, remove the ID suffix from the column
names, etc.). I will then look for the managers as you suggested.
I did find a solution to what I was trying doing. I was reading through
the Python documentation and then through the Django documentation (for the
up-teenth time) and discovered that I can "move backward" through the
relationship chain easily (I'm still not sure what the proper phrase is for
what I'm trying to do). For example, I can display the Family.Name by
simply doing something like this:
{{ object.TeacherID.ID.FamilyID }}
So, now I can do something like this:
{% if user.FamilyID = object.TeacherID.ID.FamilyID %}
Or, after making the changes that you suggested I can do this (and use the
actual ID numbers for comparison)
{% if user.Family.ID = object.Teacher.ID.Family.ID %}
Thank you again for the information that you provided. It will greatly help
me move forward from here.
-Chris
On Wednesday, July 24, 2013 2:51:43 PM UTC-4, ke1g wrote:
>
> First, is this a pre-existing data base whose format you are stuck with?
>
> While your models probably can be made to work, it is more common to let
> Django take care of creating a single primary key in a model (called "id"
> (lower case) by default).
>
> Also, while ForeignKey fields are implemented by storing the primary key
> value of the desired row in the other table, that, too, is intended to be
> hidden, so when you make a reference through a ForeignKey field, the ORM
> actually hands you an instance of the foreign Model, not the id. That is:
>
> instanceOfCourseCatalog.TeacherID
>
> is an instance of Teacher, not the TeacherID of a teacher. To get the id
> integer, for those very rare cases in which it is valuable, you woudl use:
>
> instanceOfCourseCatalog.TeacherID.TeacherID
>
> If you go the normal way and let Django create the primary key fields by
> the default name "id", and if, to better describe what is happening,
> removed the "ID from the end of your ForeignKey field names and, also a
> convention, made them lowercase, the lines above lines would become,
> respectively:
>
> instanceOfCourseCatalog.teacher
>
> and
>
> instanceOfCourseCatalog.teacher.id
>
> In this case Django would have added a "manager" to the Teacher model
> called "coursecatalog_set" (or just possibly "course_catalog_set", not
> certain and don't have time to search the documents now), but whose name
> your can specify with the "related_name" argument to the ForeignKey field.
> This manager has all the usual queryset methods, so you can append ".all()'
> to get an array of all the CourseCatalog objects with that Teacher. See
> https://docs.djangoproject.com/en/1.5/topics/db/queries/#backwards-related-objects
>
> Bill
>
>
> On Wed, Jul 24, 2013 at 8:37 AM, Chris Ryan
> <[email protected]<javascript:>
> > wrote:
>
>> I have spent hours trying to find the answer to this. What makes it even
>> more frustrating is that I'm new to django development and not a real
>> programmer by trade (I am a UNIX admin) so I am struggling to label what I
>> am trying to do so that I can search for an answer.
>>
>>
>> Here's what I have:
>>
>>
>> In my models.py file I have the following class definitions:
>>
>>
>> class Family(models.Model):
>>
>> ...
>>
>> FamilyID = models.AutoField(primary_key=True)
>>
>> Name = models.CharField(verbose_name="Family Name")
>>
>>
>>
>> ------------------------------------------------------------------------------------------------
>>
>>
>> class FamilyMember(AbstractUser):
>>
>> ....
>>
>> ID = models.AutoField(primary_key=True)
>>
>> FamilyID = models.ForeignKey(Family, blank=True, null=True)
>>
>> ...
>>
>>
>> ------------------------------------------------------------------------------------------------
>>
>>
>> class Teacher(models.Model):
>>
>> ...
>>
>> TeacherID = models.AutoField(primary_key=True)
>>
>> ID = models.OneToOneField(FamilyMember)
>>
>> ...
>>
>>
>> ------------------------------------------------------------------------------------------------
>>
>>
>>
>> class CourseCatalog(models.Model):
>>
>> ...
>>
>> TeacherID = models.ForeignKey(Teacher, blank=True, null=True)
>>
>> ...
>>
>>
>> ------------------------------------------------------------------------------------------------
>>
>>
>>
>>
>> So, there is a table called Family that I belong to. It holds my family
>> name and a couple of other fields.
>>
>> There is then a one-to-many relationship from that to the FamilyMember
>> table. In this table I have a record for each member of my family.
>>
>> The FamilyMember table is also being used as the authentication table for
>> my site. I have not replaced the default security model but only abstracted
>> it and added additional fields.
>>
>> I am a teacher so there is also a record in the Teacher table. This
>> table contains the FamilyMember.ID field.
>>
>> That's the setup for me. My main information is in the FamilyMember table
>> and my FamilyMember.ID field is stored in the Family and the Teacher tables.
>>
>>
>> On to the list of classes...
>>
>>
>> There is a table called CourseCatalog that contains information about a
>> class that I will teach. One of the columns is called TeacherID and this
>> stores the TeacherID from the Teacher table. I set it up this way so that
>> an admin can add a class and then assign it only to a teacher. The drop
>> down list should not include FamilyMembers that are not teachers.
>>
>>
>> Here are my questions and problems:
>>
>>
>> - I want to log into the website as myself and modify only my classes.
>> It would also be OK to modify the classes of everyone in my family. Either
>> solution would be fine. However, I can't figure out how to do either of
>> these things.
>>
>> - It seems to me that what I'm doing is trying to go backwards in the
>> relationship chain. I have my CourseCatalog record that includes the
>> TeacherID. I need to look that ID up in the Teacher table to get the
>> FamilyMember.ID. I then need to use that to look up the record in the
>> FamilyMember table. Once I have that, I can get the username and compare it
>> to the username of the logged in user (me). Finally, I can filter on
>> records where these two match.
>>
>> - I'm wondering if I have architected my database wrong. Is there an
>> easier way to do this? Maybe I should get rid of the Teacher table and just
>> use a boolean for teacher in the FamilyMember table. The concern that I
>> have with this is when I start working on the Student table. I need to
>> store more information about a student (allergy, emergency contacts, etc)
>> and don't think it is appropriate to add those fields to the FamilyMember
>> table because they are only used for students.
>>
>> - I'm asking for you experts to help guide me through this. Any advice
>> is greatly appreciated.
>>
>> --
>> 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 [email protected] <javascript:>.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>> Visit this group at http://groups.google.com/group/django-users.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>
--
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
For more options, visit https://groups.google.com/groups/opt_out.