You may want to look at the model _meta API.
https://docs.djangoproject.com/en/2.0/ref/models/meta/

You are looking for a list of all the ForeignKeys, but you also probably want 
other relations such as OneToOne and ManyToMany.
You probably want something like the get_all_related_objects method:
https://docs.djangoproject.com/en/2.0/ref/models/meta/#migrating-from-the-old-api

The fields have an attribute called is_relation, one_to_one, and many_to_one.


From: [email protected] [mailto:[email protected]] On 
Behalf Of Rob Schneider
Sent: Tuesday, February 27, 2018 10:46 PM
To: [email protected]
Subject: Re: How to get Foreign Key Objects programmatically?

Still a mystery to me.

--rms


On 28 Feb 2018, at 03:22, Malik Rumi 
<[email protected]<mailto:[email protected]>> wrote:
Did you ever find an answer? If so, do you mind sharing it? Thanks.

On Sunday, October 29, 2017 at 9:33:10 AM UTC-7, rmschne wrote:
I'm using Django as front end to a MySQL database. User interface is a terminal 
program, not a web site.

I've written a very simple generic function to edit the fields of one record of 
a Django "object".  It works fine for editing editable fields. User specifies 
which field, then is shown the current value, raw_input() for the new value, 
then save() the record.

For fields that connect to Foreign Keys, what I want to do is present to user a 
simple list of Foreign Key records, from which the user will pick the relevant 
ID.  I know, given a list and the ID, how to then edit the record by doing a 
Django get(id=ID) on the Foreign Key table.  What I'm having trouble doing is 
figuring how

1. Identify into a variable the name of the Foreign Key table/object
2. Then with that variable do a call to the relevant Foreign Key table, e.g. 
ForeignKeyTable.objects.all()

See code below for <===WHAT I DO NOT KNOW HOW TO DO IN CODE Below.  I think I 
need some Django function that gives me the foreign key table in some useable 
generic form.

Hope all this makes sense.

--rms

def EditDjangoObjectData(djangoobject,show=False,editonerecord=False):
    """
    EditDjangoObjectData()
        djangoojbect=a django object, e.g. a record in a table
    """
    print "\n****ToDo Note: This routine not yet working on fields with foreign 
keys!"
    changelist=[]
    ok=True
    while ok:
        change=None
        fields = [(f.name<http://f.name>, f.editable) for f in 
djangoobject._meta.get_fields()]
        if show:
            print "\nfields:\n",fields
            print "django object:\n",djangoobject
        s="\nEditable Fields ('enter' to return): \n"
        fieldlist=[]
        for i in fields:
            if i[1]:   # only for 'editable' fields
                if i[0].lower() <> "id":
                    s=s+i[0]+", "
                    fieldlist.append(i[0])
        s=s+"DELETE or '?'"
        fieldok=False
        while not fieldok:
            fieldtochange=raw_input("Enter field name to change:\n"+s+": ")
            if not fieldtochange:
                return None
            elif fieldtochange.upper()=="DELETE":
                ans=raw_input("...Confirm DELETE by typing 'DELETE': ")
                try:
                    if ans=="DELETE":
                        rtn=djangoobject.delete()
                        print "Deleted. ",rtn
                        return rtn
                except:
                    print "***DELETE Failed.",sys.exc_info()[0]
                    ans=raw_input("Press 'Enter' to continue ... ")
            elif fieldtochange=="?":
                PrintObjectDetails(djangoobject)
            elif fieldtochange in fieldlist:
                fieldok=True
            else:
                print "\n****Error. ",fieldtochange,"is not in list. Try again."
        print "Current Value of Field to 
Change:",fieldtochange,"is:",getattr(djangoobject, fieldtochange)
**
** In here add some code to show a list of the foreign key records for user to 
select, e.g. ID, Description,
**for r in ForeignKey.objects.all():   <== WHAT I DO NOT KNOW HOW TO DO IN CODE.
**    print i.id<http://i.id>, i.description
**ID=raw_input("Enter ID:)
**foreignkeyobject=ForeignKey.objects.get(id=ID)    <== WHAT I DO NOT KNOW HOW 
TO DO IN CODE.
** ... then put that object into the relevant field
        newvalue=raw_input("Enter New Value: ")
        change="changed ["+fieldtochange+"]"
        print "\nTo Save   :",djangoobject
        print "The Change:",change,"to",newvalue
        if not newvalue:
            return None
        elif newvalue.lower()=="none":
            newvalue=None
        elif newvalue.lower()=="true":
            newvalue==True
        elif newvalue.lower()=="false":
            newvalue=False
        setattr(djangoobject, fieldtochange, newvalue)
        try:
            djangoobject.save()
            print ": Success. Saved:",change,"to",newvalue
            print ": New Object:",djangoobject
            changelist.append(change)
            print "ChangeList:",changelist
        except:
            print "***Save Failed.",sys.exc_info()[0]
            ans=raw_input("Press 'Enter' to continue ... ")
        if editonerecord:
            ok=False
    return changelist

--
You received this message because you are subscribed to a topic in the Google 
Groups "Django users" group.
To unsubscribe from this topic, visit 
https://groups.google.com/d/topic/django-users/ShjLffcxFDk/unsubscribe.
To unsubscribe from this group and all its topics, send an email to 
[email protected]<mailto:[email protected]>.
To post to this group, send email to 
[email protected]<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/e6ddd293-66ac-496a-94d4-10fd44cb1224%40googlegroups.com<https://groups.google.com/d/msgid/django-users/e6ddd293-66ac-496a-94d4-10fd44cb1224%40googlegroups.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.
--
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]<mailto:[email protected]>.
To post to this group, send email to 
[email protected]<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/8EC6426B-DA91-4C27-97C1-C9D7A820E79A%40gmail.com<https://groups.google.com/d/msgid/django-users/8EC6426B-DA91-4C27-97C1-C9D7A820E79A%40gmail.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.

-- 
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 https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/f55f172131e84b2bbf188874d441658b%40ISS1.ISS.LOCAL.
For more options, visit https://groups.google.com/d/optout.

Reply via email to